home *** CD-ROM | disk | FTP | other *** search
- /*----------------------------------------------------------------------------
-
- Module name: PHIGS View Utility.
-
- Author: Gareth Williams.
-
- Function: This module contains the PHIGS viewing utility.
-
- Dependencies:
-
- Internal function list:
-
- External function list:
-
- Modification history: (Version), (Date), (name), (Description).
-
- 1.0, 26th November 1991, G. Williams, First version, based on notes by
- Karen Wyrwas.
-
- 2.0, June 1992, G. Williams, Converted to ISO PHIGS C.
-
- ----------------------------------------------------------------------------*/
-
- #include <stdio.h>
- #include <math.h>
- #include <phigs.h>
- #include "ptk.h"
-
- #define LOCDEV 1
-
- /*--------------------------------------------------------------------------*/
-
- static Pint wcwindow, vrcwindow, npcwindow, dcwindow, terminalwindow;
- static Pint viewwsid;
- static Pint viewmenuid, orimenuid, mapmenuid, windowmenuid, clipmenuid;
- static Pint rot3d1, rot3d2, rot2d1, rot2d2, rot1d;
- static Ppoint rot3d1pos, rot3d2pos, rot2d1pos, rot2d2pos, rot1dpos;
- static Pfloat maxdevx, maxdevy;
- static Pint viewscene, wcscene, vrcscene, npcscene, dcscene;
- static Pint wcaxes, vrcaxes, npccube, projviewport, viewvolume, prpmarker;
- static Pint viewplane;
- static Ppoint3 vrp;
- static Ppoint3 vpn, vup;
- static Pview_map3 viewmap;
- static Pclip_ind clipxy = PIND_NO_CLIP;
- static Pclip_ind clipfront = PIND_NO_CLIP;
- static Pclip_ind clipback = PIND_NO_CLIP;
- static Plimit3 scenespace;
- static Ppoint3 initvrp, minscene, maxscene, scenevol;
- static Plimit echoarea;
- static Pmatrix3 vommat, vmmmat;
- static Ppoint3 origin = {0.0, 0.0, 0.0};
- static Pfloat axeslength;
- static Pfloat movefactor;
- static Pint curmenu = 0;
- static Pint curwindow = 0;
- static ptkboolean inputmode = TRUE;
- static ptkboolean dcopen = TRUE;
-
- /* view editor attributes */
- static Pint menucolourind = 0;
- static Pint windowcolourind = 0;
- static Pint menutextcolourind = 1;
- static Pint bannercolourind = 1;
- static Pint bannertextcolourind = 0;
- static Pint menutextfont = 1;
- static Pint windowtextfont = 1;
- static Pint backgroundcolourind = 0;
- static Pint tlcolourind = 1;
- static Pint brcolourind = 1;
- static Pint arrowcolourind = 0;
- static Pint arrowedgecolourind = 1;
-
- /*--------------------------------------------------------------------------*/
-
- static void ptk_transformlimits3(C(Plimit3 *) lims, C(Pmatrix3) mat)
- PreANSI(Plimit3 *lims)
- PreANSI(Pmatrix3 mat)
- {
- Ppoint3 minbox, maxbox;
-
- minbox = ptk_point3(lims->x_min, lims->y_min, lims->z_min);
- maxbox = ptk_point3(lims->x_max, lims->y_max, lims->z_max);
- minbox = ptk_transform3(mat, &minbox);
- maxbox = ptk_transform3(mat, &maxbox);
- *lims = ptk_limit3(minbox.x, maxbox.x, minbox.y, maxbox.y, minbox.z,
- maxbox.z);
- } /* ptk_transformlimits3 */
-
- /*--------------------------------------------------------------------------*/
-
- static void ptk_transformlimits(C(Plimit *) lims, C(Pmatrix) mat)
- PreANSI(Plimit *lims)
- PreANSI(Pmatrix mat)
- {
- Ppoint minbox, maxbox;
-
- minbox = ptk_point(lims->x_min, lims->y_min);
- maxbox = ptk_point(lims->x_max, lims->y_max);
- minbox = ptk_transform(mat, &minbox);
- maxbox = ptk_transform(mat, &maxbox);
- *lims = ptk_limit(minbox.x, maxbox.x, minbox.y, maxbox.y);
- } /* ptk_transformlimits */
-
- /*--------------------------------------------------------------------------*/
-
- static void ptk_shiftlimits3(C(Ppoint3 *) shift, C(Plimit3 *) lims)
- PreANSI(Ppoint3 *shift)
- PreANSI(Plimit3 *lims)
- {
- Ppoint3 minbox, maxbox;
- Pmatrix3 mat;
-
- minbox = ptk_point3(lims->x_min, lims->y_min, lims->z_min);
- maxbox = ptk_point3(lims->x_max, lims->y_max, lims->z_max);
- ptk_shift3(shift, PTYPE_REPLACE, mat);
- minbox = ptk_transform3(mat, &minbox);
- maxbox = ptk_transform3(mat, &maxbox);
- *lims = ptk_limit3(minbox.x, maxbox.x, minbox.y, maxbox.y, minbox.z,
- maxbox.z);
- } /* ptk_shiftlimits3 */
-
- /*--------------------------------------------------------------------------*/
-
- static void ptk_scalelimits3(C(Ppoint3 *) scale, C(Plimit3 *) lims)
- PreANSI(Ppoint3 *scale)
- PreANSI(Plimit3 *lims)
- {
- Ppoint3 minbox, maxbox;
- Ppoint3 shift, size;
- Pmatrix3 mat;
-
- minbox = ptk_point3(lims->x_min, lims->y_min, lims->z_min);
- maxbox = ptk_point3(lims->x_max, lims->y_max, lims->z_max);
- size = ptk_subv3(&maxbox, &minbox);
- shift = ptk_point3(minbox.x + (size.x / 2.0), minbox.y + (size.y / 2.0),
- minbox.z + (size.z / 2.0));
- shift = ptk_scalev3(&shift, -1.0);
- ptk_shift3(&shift, PTYPE_REPLACE, mat);
- ptk_scale3(scale, PTYPE_POSTCONCAT, mat);
- shift = ptk_scalev3(&shift, -1.0);
- ptk_shift3(&shift, PTYPE_POSTCONCAT, mat);
- ptk_transformlimits3(lims, mat);
- } /* ptk_scalelimits3 */
-
- /*--------------------------------------------------------------------------*/
-
- static void ptk_scalelimits(C(Ppoint *) scale, C(Plimit *) lims)
- PreANSI(Ppoint *scale)
- PreANSI(Plimit *lims)
- {
- Ppoint minbox, maxbox;
- Ppoint shift, size;
- Pmatrix mat;
-
- minbox = ptk_point(lims->x_min, lims->y_min);
- maxbox = ptk_point(lims->x_max, lims->y_max);
- size = ptk_subv(&maxbox, &minbox);
- shift = ptk_point(minbox.x + (size.x / 2.0), minbox.y + (size.y / 2.0));
- shift = ptk_scalev(&shift, -1.0);
- ptk_shift(&shift, PTYPE_REPLACE, mat);
- ptk_scale(scale, PTYPE_POSTCONCAT, mat);
- shift = ptk_scalev(&shift, -1.0);
- ptk_shift(&shift, PTYPE_POSTCONCAT, mat);
- ptk_transformlimits(lims, mat);
- } /* ptk_scalelimits */
-
- /*--------------------------------------------------------------------------*/
-
- static void ptk_shiftlimits(C(Ppoint *) shift, C(Plimit *) lims)
- PreANSI(Ppoint *shift)
- PreANSI(Plimit *lims)
- {
- Ppoint minbox, maxbox;
- Pmatrix mat;
-
- minbox = ptk_point(lims->x_min, lims->y_min);
- maxbox = ptk_point(lims->x_max, lims->y_max);
- ptk_shift(shift, PTYPE_REPLACE, mat);
- minbox = ptk_transform(mat, &minbox);
- maxbox = ptk_transform(mat, &maxbox);
- *lims = ptk_limit(minbox.x, maxbox.x, minbox.y, maxbox.y);
- } /* ptk_shiftlimits */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_moverotator(C(Pint) menuid)
- PreANSI(Pint menuid)
- {
- Ppoint *pos, inpos;
- Pint initview, view_index, tot, err;
- Pin_status status;
- Plimit echo;
- Ploc_data locrec;
- char title[30];
-
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_UQUM);
- ptk_inqrotatortitle(menuid, 30, title, &tot, &err);
- ptk_setrotatortitle(menuid, "MOVE");
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- if (menuid == rot3d1)
- pos = &rot3d1pos;
- else
- if (menuid == rot3d2)
- pos = &rot3d2pos;
- else
- if (menuid == rot2d1)
- pos = &rot2d1pos;
- else
- if (menuid == rot2d2)
- pos = &rot2d2pos;
- else
- if (menuid == rot1d)
- pos = &rot1dpos;
- initview = 0;
- echo = ptk_limit(0.0, maxdevx, 0.0, maxdevy);
- /* Implementation dependent - locator data record */
- #ifdef HP
- locrec.pets.pet_r1.loc_colr_ind = 1;
- #endif
- pinit_loc(viewwsid, LOCDEV, initview, pos, 1, &echo, &locrec);
- pset_loc_mode(viewwsid, LOCDEV, POP_REQ, PSWITCH_ECHO);
- preq_loc(viewwsid, LOCDEV, &status, &view_index, &inpos);
- if (status == PIN_STATUS_OK)
- {
- *pos = inpos;
- ptk_setmenuposition(menuid, pos);
- }
- ptk_setrotatortitle(menuid, title);
- } /* do_moverotator */
-
- /*--------------------------------------------------------------------------*/
-
- static void drawaxes()
- {
- Ppoint3 pts[2];
- Ppoint_list3 ptlist;
-
- ptlist.num_points = 2;
- ptlist.points = pts;
- pts[0] = ptk_point3(0.0, 0.0, 0.0);
- pts[1] = ptk_point3(axeslength, 0.0, 0.0);
- ppolyline3(&ptlist);
- pts[1] = ptk_point3(0.0, axeslength, 0.0);
- ppolyline3(&ptlist);
- pts[1] = ptk_point3(0.0, 0.0, axeslength);
- ppolyline3(&ptlist);
- } /* drawaxes */
-
- /*--------------------------------------------------------------------------*/
-
- static void drawcube()
- {
- Pint i;
- Ppoint3 pts[5], lpts[2];
- Ppoint_list3 ptlist;
-
- pts[0] = pts[4] = ptk_point3(0.0, 0.0, 0.0);
- pts[1] = ptk_point3(0.0, 1.0, 0.0);
- pts[2] = ptk_point3(1.0, 1.0, 0.0);
- pts[3] = ptk_point3(1.0, 0.0, 0.0);
- ptlist.num_points = 5;
- ptlist.points = pts;
- ppolyline3(&ptlist);
- for (i = 0; i < 5; i++)
- pts[i].z += 1.0;
- ppolyline3(&ptlist);
- ptlist.num_points = 2;
- ptlist.points = lpts;
- for (i = 0; i < 5; i++)
- {
- lpts[0] = lpts[1] = pts[i];
- lpts[1].z -= 1.0;
- ppolyline3(&ptlist);
- }
- } /* drawcube */
-
- /*--------------------------------------------------------------------------*/
-
- static void makeviewstructs()
- {
- Pmatrix3 unitmat;
- Ppoint3 refpt, offset, markerpt, pts[5];
- Ppoint_list3 ptlist;
-
- ptk_unitmatrix3(unitmat);
- wcaxes = ptk_stringtoint("structureid", "ptk$viewwcaxes");
- vrcaxes = ptk_stringtoint("structureid", "ptk$viewvrcaxes");
- npccube = ptk_stringtoint("structureid", "ptk$viewnpccube");
- projviewport = ptk_stringtoint("structureid", "ptk$viewprojviewport");
- viewvolume = ptk_stringtoint("structureid", "ptk$viewviewvolume");
- prpmarker = ptk_stringtoint("structureid", "ptk$viewprpmarker");
- viewplane = ptk_stringtoint("structureid", "ptk$viewviewplane");
-
- ptk_openstruct(wcaxes);
- drawaxes();
- refpt = ptk_point3(axeslength, 0.0, 0.0);
- offset = ptk_point3(0.0, 0.0, 0.0);
- panno_text_rel3(&refpt, &offset, "X");
- refpt = ptk_point3(0.0, axeslength, 0.0);
- panno_text_rel3(&refpt, &offset, "Y");
- refpt = ptk_point3(0.0, 0.0, axeslength);
- panno_text_rel3(&refpt, &offset, "Z");
- ptk_closestruct();
-
- ptk_openstruct(vrcaxes);
- plabel(ptk_stringtoint("label", "view$mx_inv_vom"));
- pset_local_tran3(unitmat, PTYPE_REPLACE);
- drawaxes();
- refpt = ptk_point3(axeslength, 0.0, 0.0);
- offset = ptk_point3(0.0, 0.0, 0.0);
- panno_text_rel3(&refpt, &offset, "U");
- refpt = ptk_point3(0.0, axeslength, 0.0);
- panno_text_rel3(&refpt, &offset, "V");
- refpt = ptk_point3(0.0, 0.0, axeslength);
- panno_text_rel3(&refpt, &offset, "N");
- ptk_closestruct();
-
- ptk_openstruct(npccube);
- drawcube();
- ptk_closestruct();
-
- ptk_openstruct(projviewport);
- plabel(ptk_stringtoint("label", "view$mx_proj_viewport"));
- pset_local_tran3(unitmat, PTYPE_REPLACE);
- pset_linetype(PLINE_DASH);
- drawcube();
- ptk_closestruct();
-
- ptk_openstruct(viewvolume);
- plabel(ptk_stringtoint("label", "view$mx_view_volume"));
- pset_local_tran3(unitmat, PTYPE_REPLACE);
- drawcube();
- ptk_closestruct();
-
- ptk_openstruct(prpmarker);
- plabel(ptk_stringtoint("label", "view$mx_prp"));
- pset_local_tran3(unitmat, PTYPE_REPLACE);
- markerpt = ptk_point3(0.0, 0.0, 0.0);
- ptlist.num_points = 1;
- ptlist.points = &markerpt;
- ppolymarker3(&ptlist);
- ptk_closestruct();
-
- ptk_openstruct(viewplane);
- plabel(ptk_stringtoint("label", "view$mx_view_plane"));
- pset_local_tran3(unitmat, PTYPE_REPLACE);
- pts[0] = pts[4] = ptk_point3(0.0, 0.0, 0.0);
- pts[1] = ptk_point3(0.0, 1.0, 0.0);
- pts[2] = ptk_point3(1.0, 1.0, 0.0);
- pts[3] = ptk_point3(1.0, 0.0, 0.0);
- ptlist.num_points = 5;
- ptlist.points = pts;
- ppolyline3(&ptlist);
- ptk_closestruct();
- } /* makeviewstructs */
-
- /*--------------------------------------------------------------------------*/
-
- static void combinelimits(C(Plimit3 *) lim1, C(Plimit3 *) lim2)
- PreANSI(Plimit3 *lim1)
- PreANSI(Plimit3 *lim2)
- {
- if (lim1->x_min < lim2->x_min)
- lim2->x_min = lim1->x_min;
- if (lim1->x_max > lim2->x_max)
- lim2->x_max = lim1->x_max;
- if (lim1->y_min < lim2->y_min)
- lim2->y_min = lim1->y_min;
- if (lim1->y_max > lim2->y_max)
- lim2->y_max = lim1->y_max;
- if (lim1->z_min < lim2->z_min)
- lim2->z_min = lim1->z_min;
- if (lim1->z_max > lim2->z_max)
- lim2->z_max = lim1->z_max;
- } /* combinelimits */
-
- /*--------------------------------------------------------------------------*/
-
- static ptkboolean do_scene(C(Pint_list *) stids)
- PreANSI(Pint_list *stids)
- {
- Plimit3 stlimits;
- Ppoint3 minbox, maxbox, dimen;
- Pint i;
-
- scenespace = ptk_limit3(10000.0, -10000.0, 10000.0, -10000.0,
- 10000.0, -10000.0);
- for (i = 0; i < stids->num_ints; i++)
- {
- if (ptk_boundingbox(stids->ints[i], &stlimits, TRUE))
- {
- if (stlimits.x_min < scenespace.x_min)
- scenespace.x_min = stlimits.x_min;
- if (stlimits.y_min < scenespace.y_min)
- scenespace.y_min = stlimits.y_min;
- if (stlimits.z_min < scenespace.z_min)
- scenespace.z_min = stlimits.z_min;
- if (stlimits.x_max > scenespace.x_max)
- scenespace.x_max = stlimits.x_max;
- if (stlimits.y_max > scenespace.y_max)
- scenespace.y_max = stlimits.y_max;
- if (stlimits.z_max > scenespace.z_max)
- scenespace.z_max = stlimits.z_max;
- }
- }
- if (scenespace.x_min == 10000.0)
- return FALSE;
- minbox = ptk_point3(scenespace.x_min, scenespace.y_min, scenespace.z_min);
- maxbox = ptk_point3(scenespace.x_max, scenespace.y_max, scenespace.z_max);
- dimen = ptk_subv3(&maxbox, &minbox);
- axeslength = PTKMAX(dimen.x, dimen.y);
- axeslength = PTKMAX(axeslength, dimen.z);
- movefactor = axeslength / 10.0;
- axeslength /= 2.0;
- pempty_struct(viewscene);
- ptk_openstruct(viewscene);
- for (i = 0; i < stids->num_ints; i++)
- pexec_struct(stids->ints[i]);
- ptk_closestruct();
- return TRUE;
- } /* do_scene */
-
- /*--------------------------------------------------------------------------*/
-
- static void initialiseeditor()
- {
- Pint i, err;
- Pmatrix3 unitmat;
- Plimit3 stlimits, wclimits, axeslimits;
- Pint_list windworld;
- Pfloat maxscenevol;
-
- /* view settings */
- vpn = ptk_point3(0.0, 0.0, 1.0);
- vup = ptk_point3(0.0, 1.0, 0.0);
- viewmap.view_plane = 0.0;
- viewmap.proj_type = PTYPE_PARAL;
-
- /* find centre of scene */
- minscene = ptk_point3(scenespace.x_min, scenespace.y_min, scenespace.z_min);
- maxscene = ptk_point3(scenespace.x_max, scenespace.y_max, scenespace.z_max);
- initvrp = ptk_subv3(&maxscene, &minscene);
- initvrp = ptk_scalev3(&initvrp, 0.5);
- initvrp = ptk_addv3(&initvrp, &minscene);
- vrp = initvrp;
- scenevol = ptk_subv3(&maxscene, &minscene);
- maxscenevol = PTKMAX(scenevol.x, scenevol.y);
- maxscenevol = PTKMAX(maxscenevol, scenevol.z);
- maxscenevol *= 2.0;
- viewmap.win = ptk_limit(-scenevol.x / 2.0, scenevol.x / 2.0,
- -scenevol.y / 2.0, scenevol.y / 2.0);
- viewmap.proj_ref_point = ptk_point3(0.0, 0.0, maxscenevol / 2.0);
- viewmap.front_plane = scenevol.z + (maxscenevol / 20.0);
- viewmap.back_plane = -viewmap.front_plane;
-
- viewmap.proj_vp = ptk_limit3(0.5 - scenevol.x / maxscenevol,
- 0.5 + scenevol.x / maxscenevol,
- 0.5 - scenevol.y / maxscenevol,
- 0.5 + scenevol.y / maxscenevol,
- 0.5 - scenevol.z / maxscenevol,
- 0.5 + scenevol.z / maxscenevol);
- ptk_unitmatrix3(unitmat);
- ptk_unitmatrix3(vommat);
- ptk_unitmatrix3(vmmmat);
-
- ptk_openstruct(wcscene);
- pexec_struct(viewscene);
- pexec_struct(wcaxes);
- pexec_struct(vrcaxes);
- ptk_closestruct();
-
- ptk_openstruct(vrcscene);
- plabel(ptk_stringtoint("label", "view$mx_vom"));
- pset_local_tran3(unitmat, PTYPE_REPLACE);
- pexec_struct(viewscene);
- pexec_struct(viewvolume);
- pexec_struct(viewplane);
- plabel(ptk_stringtoint("label", "view$mx_vrp"));
- pset_local_tran3(unitmat, PTYPE_POSTCONCAT);
- pexec_struct(prpmarker);
- ptk_closestruct();
-
- ptk_openstruct(npcscene);
- plabel(ptk_stringtoint("label", "view$mx_vom"));
- pset_local_tran3(unitmat, PTYPE_REPLACE);
- plabel(ptk_stringtoint("label", "view$mx_vmm"));
- pset_local_tran3(unitmat, PTYPE_POSTCONCAT);
- pexec_struct(viewscene);
- pset_local_tran3(unitmat, PTYPE_REPLACE);
- pexec_struct(npccube);
- pexec_struct(projviewport);
- ptk_closestruct();
-
- ptk_openstruct(dcscene);
- plabel(ptk_stringtoint("label", "view$mx_vom"));
- pset_local_tran3(unitmat, PTYPE_REPLACE);
- plabel(ptk_stringtoint("label", "view$mx_vmm"));
- pset_local_tran3(unitmat, PTYPE_POSTCONCAT);
- pexec_struct(viewscene);
- ptk_closestruct();
-
- wclimits = scenespace;
- ptk_boundingbox(wcaxes, &axeslimits, TRUE);
- combinelimits(&axeslimits, &wclimits);
- ptk_boundingbox(vrcaxes, &axeslimits, TRUE);
- combinelimits(&axeslimits, &wclimits);
-
- /* wclimits.x_max = MAX(fabs(scenespace.x_min), fabs(scenespace.x_max));
- wclimits.y_max = MAX(fabs(scenespace.y_min), fabs(scenespace.y_max));
- wclimits.z_max = MAX(fabs(scenespace.z_min), fabs(scenespace.z_max));
- wclimits.x_min = -wclimits.x_max;
- wclimits.y_min = -wclimits.y_max;
- wclimits.z_min = -wclimits.z_max; */
-
- ptk_setcameralimits(wcwindow, &wclimits, TRUE);
- ptk_setcamerastate(dcwindow, PTKECAMERAOFF);
- ptk_posttowindow(wcwindow, wcscene);
- ptk_posttowindow(vrcwindow, vrcscene);
- ptk_posttowindow(npcwindow, npcscene);
- ptk_posttowindow(dcwindow, dcscene);
- } /* initialiseeditor */
-
- /*--------------------------------------------------------------------------*/
-
- static ptkboolean checkmapping(C(Pview_map3 *) map)
- PreANSI(Pview_map3 *map)
- {
- Pint err;
- Pmatrix3 mat;
-
- peval_view_map_matrix3(map, &err, mat);
- if (err == 0)
- return TRUE;
- else
- return FALSE;
- } /* checkmapping */
-
- /*--------------------------------------------------------------------------*/
-
- static void updatevrcwindow()
- {
- Plimit3 limits, templims;
-
- limits = scenespace;
- ptk_boundingbox(viewvolume, &templims, TRUE);
- combinelimits(&templims, &limits);
- ptk_boundingbox(prpmarker, &templims, TRUE);
- combinelimits(&templims, &limits);
- ptk_transformlimits3(&limits, vommat);
- ptk_setcameralimits(vrcwindow, &limits, TRUE);
- } /* updatevrcwindow */
-
- /*--------------------------------------------------------------------------*/
-
- static void updatenpcwindow()
- {
- Plimit3 limits, templims;
- Pmatrix3 mat;
-
- limits = scenespace;
- ptk_multiplymatrix3(vmmmat, vommat, mat);
- ptk_transformlimits3(&limits, mat);
- templims = ptk_limit3(0.0, 1.0, 0.0, 1.0, 0.0, 1.0);
- combinelimits(&templims, &limits);
- ptk_setcameralimits(npcwindow, &limits, TRUE);
- } /* updatenpcwindow */
-
- /*--------------------------------------------------------------------------*/
-
- static void updatedcwindow()
- {
- Pint err;
- Plimit window;
- Ppoint3 prp, vrp;
- Pfloat width, height, depth;
- Ppoint3 vpn, vup;
-
- width = viewmap.proj_vp.x_max - viewmap.proj_vp.x_min;
- height = viewmap.proj_vp.y_max - viewmap.proj_vp.y_min;
- depth = viewmap.proj_vp.z_max - viewmap.proj_vp.z_min;
- vpn = ptk_point3(0.0, 0.0, 1.0);
- vup = ptk_point3(0.0, 1.0, 0.0);
- vrp = ptk_point3(width / 2.0 + viewmap.proj_vp.x_min,
- height / 2.0 + viewmap.proj_vp.y_min,
- depth / 2.0 + viewmap.proj_vp.z_min);
- ptk_setvieworientation3(dcwindow, &vrp, &vpn, &vup, &err);
- window = ptk_limit(-width / 2.0, width / 2.0, -height / 2.0, height / 2.0);
- prp = ptk_point3(0.0, 0.0, 2.0);
- ptk_setviewmapping3(dcwindow, &window, &viewmap.proj_vp, PTYPE_PARAL,
- &prp, 0.0, -depth / 2.0, depth / 2.0, &err);
- ptk_setviewclipping3(dcwindow, &viewmap.proj_vp, clipxy, clipback,
- clipfront);
- } /* updatedcwindow */
-
- /*--------------------------------------------------------------------------*/
-
- static void updatewindows()
- {
- updatevrcwindow();
- updatenpcwindow();
- updatedcwindow();
- } /* updatewindows */
-
- /*--------------------------------------------------------------------------*/
-
- static void updatemxvom()
- {
- Pint err;
- Pmatrix3 vrpmat;
-
- /* view orientation matrix */
- ptk_pevalvieworientationmatrix3(&vrp, &vpn, &vup, &err, vommat);
- /* edit all structures using vom */
- ptk_seteditmode(PEDIT_REPLACE);
- ptk_openstruct(vrcscene);
- pset_elem_ptr(0);
- pset_elem_ptr_label(ptk_stringtoint("label", "view$mx_vom"));
- poffset_elem_ptr(1);
- pset_local_tran3(vommat, PTYPE_REPLACE);
- pset_elem_ptr_label(ptk_stringtoint("label", "view$mx_vrp"));
- poffset_elem_ptr(1);
- ptk_shift3(&vrp, PTYPE_REPLACE, vrpmat);
- pset_local_tran3(vrpmat, PTYPE_PRECONCAT);
- ptk_closestruct();
-
- ptk_openstruct(npcscene);
- pset_elem_ptr(0);
- pset_elem_ptr_label(ptk_stringtoint("label", "view$mx_vom"));
- poffset_elem_ptr(1);
- pset_local_tran3(vommat, PTYPE_REPLACE);
- ptk_closestruct();
-
- ptk_openstruct(dcscene);
- pset_elem_ptr(0);
- pset_elem_ptr_label(ptk_stringtoint("label", "view$mx_vom"));
- poffset_elem_ptr(1);
- pset_local_tran3(vommat, PTYPE_REPLACE);
- ptk_closestruct();
- ptk_unseteditmode();
- } /* updatemxvom */
-
- /*--------------------------------------------------------------------------*/
-
- static void updatemxinvvom()
- {
- Pmatrix3 invvommat;
- Pint err;
-
- ptk_invertmatrix3(vommat, invvommat, &err);
- /* edit all structures using invvom */
- ptk_seteditmode(PEDIT_REPLACE);
- ptk_openstruct(vrcaxes);
- pset_elem_ptr(0);
- pset_elem_ptr_label(ptk_stringtoint("label", "view$mx_inv_vom"));
- poffset_elem_ptr(1);
- pset_local_tran3(invvommat, PTYPE_REPLACE);
- ptk_closestruct();
- ptk_unseteditmode();
- } /* updatemxinvvom */
-
- /*--------------------------------------------------------------------------*/
-
- static void updatemxvmm()
- {
- Pint err;
-
- /* view mapping matrix */
- peval_view_map_matrix3(&viewmap, &err, vmmmat);
-
- ptk_seteditmode(PEDIT_REPLACE);
- ptk_openstruct(npcscene);
- pset_elem_ptr(0);
- pset_elem_ptr_label(ptk_stringtoint("label", "view$mx_vmm"));
- poffset_elem_ptr(1);
- pset_local_tran3(vmmmat, PTYPE_POSTCONCAT);
- ptk_closestruct();
-
- ptk_openstruct(dcscene);
- pset_elem_ptr(0);
- pset_elem_ptr_label(ptk_stringtoint("label", "view$mx_vmm"));
- poffset_elem_ptr(1);
- pset_local_tran3(vmmmat, PTYPE_POSTCONCAT);
- ptk_closestruct();
- ptk_unseteditmode();
- } /* updatemxvmm */
-
- /*--------------------------------------------------------------------------*/
-
- static void updatemxviewvolume()
- {
- Plimit3 unitcube, viewvol;
- Pmatrix3 viewvolmat;
- Pint err;
-
- unitcube = ptk_limit3(0.0, 1.0, 0.0, 1.0, 0.0, 1.0);
- viewvol = ptk_limit3(viewmap.win.x_min, viewmap.win.x_max,
- viewmap.win.y_min, viewmap.win.y_max,
- viewmap.back_plane, viewmap.front_plane);
- viewvol.x_min += vrp.x;
- viewvol.x_max += vrp.x;
- viewvol.y_min += vrp.y;
- viewvol.y_max += vrp.y;
- viewvol.z_min += vrp.z;
- viewvol.z_max += vrp.z;
- ptk_box3tobox3(&unitcube, &viewvol, FALSE, PTYPE_REPLACE, viewvolmat, &err);
- ptk_seteditmode(PEDIT_REPLACE);
- ptk_openstruct(viewvolume);
- pset_elem_ptr(0);
- pset_elem_ptr_label(ptk_stringtoint("label", "view$mx_view_volume"));
- poffset_elem_ptr(1);
- pset_local_tran3(viewvolmat, PTYPE_REPLACE);
- ptk_closestruct();
- ptk_unseteditmode();
- } /* updatemxviewvolume */
-
- /*--------------------------------------------------------------------------*/
-
- static void updatemxprojviewport()
- {
- Plimit3 unitcube, viewvol;
- Pmatrix3 projviewmat;
- Pint err;
-
- unitcube = ptk_limit3(0.0, 1.0, 0.0, 1.0, 0.0, 1.0);
- ptk_box3tobox3(&unitcube, &viewmap.proj_vp, FALSE, PTYPE_REPLACE, projviewmat,
- &err);
- ptk_seteditmode(PEDIT_REPLACE);
- ptk_openstruct(projviewport);
- pset_elem_ptr(0);
- pset_elem_ptr_label(ptk_stringtoint("label", "view$mx_proj_viewport"));
- poffset_elem_ptr(1);
- pset_local_tran3(projviewmat, PTYPE_REPLACE);
- ptk_closestruct();
- ptk_unseteditmode();
- } /* updatemxprojviewport */
-
- /*--------------------------------------------------------------------------*/
-
- static void updatemxprp()
- {
- Pmatrix3 prpmat;
- Ppoint3 shiftprp;
- Pint err;
-
- /* shiftprp = ptk_scalev3(&viewmap.proj_ref_point, -1.0); */
- shiftprp = viewmap.proj_ref_point;
- ptk_shift3(&shiftprp, PTYPE_REPLACE, prpmat);
- ptk_seteditmode(PEDIT_REPLACE);
- ptk_openstruct(prpmarker);
- pset_elem_ptr(0);
- pset_elem_ptr_label(ptk_stringtoint("label", "view$mx_prp"));
- poffset_elem_ptr(1);
- pset_local_tran3(prpmat, PTYPE_REPLACE);
- ptk_closestruct();
- ptk_unseteditmode();
- } /* updatemxprp */
-
- /*--------------------------------------------------------------------------*/
-
- static void updatemxviewplane()
- {
- Pmatrix3 viewplanemat;
- Plimit3 unitcube, viewvol;
- Pint err;
-
- unitcube = ptk_limit3(0.0, 1.0, 0.0, 1.0, 0.0, 0.0);
- viewvol = ptk_limit3(viewmap.win.x_min, viewmap.win.x_max,
- viewmap.win.y_min, viewmap.win.y_max,
- viewmap.view_plane, viewmap.view_plane);
- viewvol.x_min += vrp.x;
- viewvol.x_max += vrp.x;
- viewvol.y_min += vrp.y;
- viewvol.y_max += vrp.y;
- viewvol.z_min += vrp.z;
- viewvol.z_max += vrp.z;
- ptk_box3tobox3(&unitcube, &viewvol, FALSE, PTYPE_REPLACE, viewplanemat, &err);
- ptk_seteditmode(PEDIT_REPLACE);
- ptk_openstruct(viewplane);
- pset_elem_ptr(0);
- pset_elem_ptr_label(ptk_stringtoint("label", "view$mx_view_plane"));
- poffset_elem_ptr(1);
- pset_local_tran3(viewplanemat, PTYPE_REPLACE);
- ptk_closestruct();
- ptk_unseteditmode();
- } /* updatemxviewplane */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_shiftpoint3(C(ptksmenuoutput *) menuout, C(Ppoint3 *) pt)
- PreANSI(ptksmenuoutput *menuout)
- PreANSI(Ppoint3 *pt)
- {
- Ppoint shift;
- Pfloat shiftfactor;
-
- switch (menuout->itemnum)
- {
- case 1: /* increase y */
- shiftfactor = menuout->value.y * movefactor;
- pt->y += shiftfactor;
- break;
-
- case 2: /* decrease y */
- shiftfactor = (1.0 - menuout->value.y) * movefactor;
- pt->y -= shiftfactor;
- break;
-
- case 3: /* decrease x */
- shiftfactor = (1.0 - menuout->value.x) * movefactor;
- pt->x -= shiftfactor;
- break;
-
- case 4: /* increase x */
- shiftfactor = menuout->value.x * movefactor;
- pt->x += shiftfactor;
- break;
-
- case 5: /* decrease z */
- shiftfactor = menuout->value.y * movefactor;
- pt->z -= shiftfactor;
- break;
-
- case 6: /* increase z */
- shiftfactor = menuout->value.y * movefactor;
- pt->z += shiftfactor;
- break;
- }
- } /* do_shiftpoint3 */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_vrp()
- {
- Ppoint locpos;
- ptkboolean quit;
- Pint wsid, devnum, viewindex;
- Pin_class class;
- ptksgeneralinput geninput;
- ptksmenuoutput menuoutput;
-
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- if (!inputmode)
- {
- vrp.x = ptk_readfloat(viewwsid, 0.0, "Input vrp, x (0.0) >", &echoarea);
- vrp.y = ptk_readfloat(viewwsid, 0.0, "Input vrp, y (0.0) >", &echoarea);
- vrp.z = ptk_readfloat(viewwsid, 0.0, "Input vrp, z (0.0) >", &echoarea);
- updatemxvom();
- updatemxinvvom();
- updatemxviewvolume();
- updatemxviewplane();
- updatemxprp();
- updatedcwindow();
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- else
- {
- ptk_setrotatortitle(rot3d1, "shift vrp");
- ptk_postmenu(viewwsid, rot3d1);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- quit = FALSE;
- do
- {
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- pawait_event(0.0, &wsid, &class, &devnum);
- if ((class == PIN_LOC) && (wsid == viewwsid))
- {
- pget_loc(&viewindex, &locpos);
- geninput.inputclass = PIN_LOC;
- geninput.ptkugeninput.locpoint = locpos;
- if (ptk_scanmenus(viewwsid, &geninput, &menuoutput))
- {
- pset_loc_mode(viewwsid, LOCDEV, POP_REQ, PSWITCH_ECHO);
- if (menuoutput.menuid == rot3d1)
- {
- if (menuoutput.itemnum == 0)
- do_moverotator(rot3d1);
- else
- {
- do_shiftpoint3(&menuoutput, &vrp);
- updatemxvom();
- updatemxinvvom();
- updatemxviewvolume();
- updatemxviewplane();
- updatemxprp();
- updatedcwindow();
- }
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- }
- else
- {
- quit = TRUE;
- }
- }
- } while (!quit);
- }
- ptk_unpostmenu(viewwsid, rot3d1);
- } /* do_vrp */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_rotatevector(C(ptksmenuoutput *) menuout, C(Ppoint3 *) vec)
- PreANSI(ptksmenuoutput *menuout)
- PreANSI(Ppoint3 *vec)
- {
- Ppoint3 axis;
- Pmatrix3 mat;
- Pint err;
- Pfloat angle;
-
- switch (menuout->itemnum)
- {
- case 1:
- angle = menuout->value.y * 10.0;
- axis = ptk_point3(1.0, 0.0, 0.0);
- ptk_rotateline3(&origin, &axis, -angle, PTYPE_REPLACE, mat, &err);
- *vec = ptk_transform3(mat, vec);
- break;
-
- case 2:
- angle = (1.0 - menuout->value.y) * 10.0;
- axis = ptk_point3(1.0, 0.0, 0.0);
- ptk_rotateline3(&origin, &axis, angle, PTYPE_REPLACE, mat, &err);
- *vec = ptk_transform3(mat, vec);
- break;
-
- case 3:
- angle = (1.0 - menuout->value.y) * 10.0;
- axis = ptk_point3(0.0, 1.0, 0.0);
- ptk_rotateline3(&origin, &axis, -angle, PTYPE_REPLACE, mat, &err);
- *vec = ptk_transform3(mat, vec);
- break;
-
- case 4:
- angle = menuout->value.y * 10.0;
- axis = ptk_point3(0.0, 1.0, 0.0);
- ptk_rotateline3(&origin, &axis, angle, PTYPE_REPLACE, mat, &err);
- *vec = ptk_transform3(mat, vec);
- break;
-
- case 5:
- angle = menuout->value.y * 10.0;
- axis = ptk_point3(0.0, 0.0, 1.0);
- ptk_rotateline3(&origin, &axis, angle, PTYPE_REPLACE, mat, &err);
- *vec = ptk_transform3(mat, vec);
- break;
-
- case 6:
- angle = menuout->value.y * 10.0;
- axis = ptk_point3(0.0, 0.0, 1.0);
- ptk_rotateline3(&origin, &axis, -angle, PTYPE_REPLACE, mat, &err);
- *vec = ptk_transform3(mat, vec);
- break;
- }
- } /* do_rotatevector */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_vpn()
- {
- Ppoint locpos;
- ptkboolean quit;
- Pint wsid, devnum, viewindex;
- Pin_class class;
- ptksgeneralinput geninput;
- ptksmenuoutput menuoutput;
-
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- if (!inputmode)
- {
- vpn.x = ptk_readfloat(viewwsid, 0.0, "Input vpn, x (0.0) >", &echoarea);
- vpn.y = ptk_readfloat(viewwsid, 0.0, "Input vpn, y (0.0) >", &echoarea);
- vpn.z = ptk_readfloat(viewwsid, 0.0, "Input vpn, z (0.0) >", &echoarea);
- updatemxvom();
- updatemxinvvom();
- updatedcwindow();
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- else
- {
- ptk_setrotatortitle(rot3d1, "rotate vpn");
- ptk_postmenu(viewwsid, rot3d1);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- quit = FALSE;
- do
- {
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- pawait_event(0.0, &wsid, &class, &devnum);
- if ((class == PIN_LOC) && (wsid == viewwsid))
- {
- pget_loc(&viewindex, &locpos);
- geninput.inputclass = PIN_LOC;
- geninput.ptkugeninput.locpoint = locpos;
- if (ptk_scanmenus(viewwsid, &geninput, &menuoutput))
- {
- pset_loc_mode(viewwsid, LOCDEV, POP_REQ, PSWITCH_ECHO);
- if (menuoutput.menuid == rot3d1)
- {
- if (menuoutput.itemnum == 0)
- do_moverotator(rot3d1);
- else
- {
- do_rotatevector(&menuoutput, &vpn);
- updatemxvom();
- updatemxinvvom();
- updatedcwindow();
- }
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- }
- else
- {
- quit = TRUE;
- }
- }
- } while (!quit);
- }
- ptk_unpostmenu(viewwsid, rot3d1);
- } /* do_vpn */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_vup()
- {
- Ppoint locpos;
- ptkboolean quit;
- Pint wsid, devnum, viewindex;
- Pin_class class;
- ptksgeneralinput geninput;
- ptksmenuoutput menuoutput;
-
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- if (!inputmode)
- {
- vup.x = ptk_readfloat(viewwsid, 0.0, "Input vup, x (0.0) >", &echoarea);
- vup.y = ptk_readfloat(viewwsid, 0.0, "Input vup, y (0.0) >", &echoarea);
- vup.z = ptk_readfloat(viewwsid, 0.0, "Input vup, z (0.0) >", &echoarea);
- updatemxvom();
- updatemxinvvom();
- updatedcwindow();
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- else
- {
- ptk_setrotatortitle(rot3d1, "rotate vup");
- ptk_postmenu(viewwsid, rot3d1);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- quit = FALSE;
- do
- {
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- pawait_event(0.0, &wsid, &class, &devnum);
- if ((class == PIN_LOC) && (wsid == viewwsid))
- {
- pget_loc(&viewindex, &locpos);
- geninput.inputclass = PIN_LOC;
- geninput.ptkugeninput.locpoint = locpos;
- if (ptk_scanmenus(viewwsid, &geninput, &menuoutput))
- {
- pset_loc_mode(viewwsid, LOCDEV, POP_REQ, PSWITCH_ECHO);
- if (menuoutput.menuid == rot3d1)
- {
- if (menuoutput.itemnum == 0)
- do_moverotator(rot3d1);
- else
- {
- do_rotatevector(&menuoutput, &vup);
- updatemxvom();
- updatemxinvvom();
- updatedcwindow();
- }
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- }
- else
- {
- quit = TRUE;
- }
- }
- } while (!quit);
- }
- ptk_unpostmenu(viewwsid, rot3d1);
- } /* do_vup */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_prp()
- {
- Ppoint locpos;
- ptkboolean quit;
- Pint wsid, devnum, viewindex;
- Pin_class class;
- ptksgeneralinput geninput;
- ptksmenuoutput menuoutput;
- Ploc_data locrec;
- Pview_map3 tempmap;
-
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- if (!inputmode)
- {
- viewmap.proj_ref_point.x = ptk_readfloat(viewwsid, 0.0,
- "Input prp, x (0.0) >", &echoarea);
- viewmap.proj_ref_point.y = ptk_readfloat(viewwsid, 0.0,
- "Input prp, y (0.0) >", &echoarea);
- viewmap.proj_ref_point.z = ptk_readfloat(viewwsid, 0.0,
- "Input prp, z (0.0) >", &echoarea);
- updatemxvmm();
- updatemxprp();
- updatemxviewvolume();
- updatedcwindow();
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- else
- {
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- ptk_setrotatortitle(rot3d1, "shift prp");
- ptk_postmenu(viewwsid, rot3d1);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- tempmap = viewmap;
- quit = FALSE;
- do
- {
- pawait_event(0.0, &wsid, &class, &devnum);
- if ((class == PIN_LOC) && (wsid == viewwsid))
- {
- pget_loc(&viewindex, &locpos);
- geninput.inputclass = PIN_LOC;
- geninput.ptkugeninput.locpoint = locpos;
- if (ptk_scanmenus(viewwsid, &geninput, &menuoutput))
- {
- pset_loc_mode(viewwsid, LOCDEV, POP_REQ, PSWITCH_ECHO);
- if (menuoutput.menuid == rot3d1)
- {
- if (menuoutput.itemnum == 0)
- do_moverotator(rot3d1);
- else
- {
- tempmap.proj_ref_point = viewmap.proj_ref_point;
- do_shiftpoint3(&menuoutput, &tempmap.proj_ref_point);
- if (checkmapping(&tempmap))
- {
- viewmap.proj_ref_point = tempmap.proj_ref_point;
- updatemxvmm();
- updatemxprp();
- updatemxviewvolume();
- updatedcwindow();
- }
- }
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- }
- else
- {
- quit = TRUE;
- }
- }
- } while (!quit);
- }
- ptk_unpostmenu(viewwsid, rot3d1);
- } /* do_prp */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_viewplane()
- {
- Ppoint locpos;
- ptkboolean quit;
- Pint wsid, devnum, viewindex;
- Pin_class class;
- ptksgeneralinput geninput;
- ptksmenuoutput menuoutput;
- Pview_map3 tempmap;
-
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- if (!inputmode)
- {
- tempmap = viewmap;
- tempmap.view_plane = ptk_readfloat(viewwsid, 0.0,
- "Input view plane distance (0.0) >", &echoarea);
- if (checkmapping(&tempmap))
- {
- viewmap.view_plane = tempmap.view_plane;
- updatemxviewplane();
- updatemxprp();
- updatemxviewvolume();
- updatedcwindow();
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- }
- else
- {
- ptk_setrotatortitle(rot1d, "shift plane");
- ptk_postmenu(viewwsid, rot1d);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- tempmap = viewmap;
- quit = FALSE;
- do
- {
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- pawait_event(0.0, &wsid, &class, &devnum);
- if ((class == PIN_LOC) && (wsid == viewwsid))
- {
- pget_loc(&viewindex, &locpos);
- geninput.inputclass = PIN_LOC;
- geninput.ptkugeninput.locpoint = locpos;
- if (ptk_scanmenus(viewwsid, &geninput, &menuoutput))
- {
- pset_loc_mode(viewwsid, LOCDEV, POP_REQ, PSWITCH_ECHO);
- if (menuoutput.menuid == rot1d)
- {
- if (menuoutput.itemnum == 0)
- do_moverotator(rot1d);
- else
- {
- tempmap.view_plane = viewmap.view_plane;
- switch (menuoutput.itemnum)
- {
- case 1:
- tempmap.view_plane += menuoutput.value.y * movefactor;
- break;
-
- case 2:
- tempmap.view_plane -= (1.0 - menuoutput.value.y) *
- movefactor;
- break;
- }
- if (checkmapping(&tempmap))
- {
- viewmap.view_plane = tempmap.view_plane;
- updatemxviewplane();
- updatemxprp();
- updatemxviewvolume();
- updatedcwindow();
- }
- }
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- }
- else
- {
- quit = TRUE;
- }
- }
- } while (!quit);
- }
- ptk_unpostmenu(viewwsid, rot1d);
- } /* do_viewplane */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_frontplane()
- {
- Ppoint pos, locpos;
- ptkboolean quit;
- Pint wsid, devnum, viewindex;
- Pin_class class;
- ptksgeneralinput geninput;
- ptksmenuoutput menuoutput;
- Pview_map3 tempmap;
-
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- if (!inputmode)
- {
- tempmap = viewmap;
- tempmap.front_plane = ptk_readfloat(viewwsid, 0.0,
- "Input front plane distance (0.0) >", &echoarea);
- if (checkmapping(&tempmap))
- {
- viewmap.front_plane = tempmap.front_plane;
- updatemxviewplane();
- updatemxprp();
- updatemxviewvolume();
- updatedcwindow();
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- }
- else
- {
- ptk_setrotatortitle(rot1d, "shift plane");
- ptk_postmenu(viewwsid, rot1d);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- tempmap = viewmap;
- quit = FALSE;
- do
- {
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- pawait_event(0.0, &wsid, &class, &devnum);
- if ((class == PIN_LOC) && (wsid == viewwsid))
- {
- pget_loc(&viewindex, &locpos);
- geninput.inputclass = PIN_LOC;
- geninput.ptkugeninput.locpoint = locpos;
- if (ptk_scanmenus(viewwsid, &geninput, &menuoutput))
- {
- pset_loc_mode(viewwsid, LOCDEV, POP_REQ, PSWITCH_ECHO);
- if (menuoutput.menuid == rot1d)
- {
- if (menuoutput.itemnum == 0)
- do_moverotator(rot1d);
- else
- {
- tempmap.front_plane = viewmap.front_plane;
- switch (menuoutput.itemnum)
- {
- case 1:
- tempmap.front_plane += menuoutput.value.y * movefactor;
- break;
-
- case 2:
- tempmap.front_plane -= (1.0 - menuoutput.value.y) *
- movefactor;
- break;
- }
- if (checkmapping(&tempmap))
- {
- viewmap.front_plane = tempmap.front_plane;
- updatemxvmm();
- updatemxviewvolume();
- updatedcwindow();
- }
- }
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- }
- else
- {
- quit = TRUE;
- }
- }
- } while (!quit);
- }
- ptk_unpostmenu(viewwsid, rot1d);
- } /* do_frontplane */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_backplane()
- {
- Ppoint locpos;
- ptkboolean quit;
- Pint wsid, devnum, viewindex;
- Pin_class class;
- ptksgeneralinput geninput;
- ptksmenuoutput menuoutput;
- Pview_map3 tempmap;
-
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- if (!inputmode)
- {
- tempmap = viewmap;
- tempmap.back_plane = ptk_readfloat(viewwsid, 0.0,
- "Input back plane distance (0.0) >", &echoarea);
- if (checkmapping(&tempmap))
- {
- viewmap.back_plane = tempmap.back_plane;
- updatemxviewplane();
- updatemxprp();
- updatemxviewvolume();
- updatedcwindow();
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- }
- else
- {
- ptk_setrotatortitle(rot1d, "shift plane");
- ptk_postmenu(viewwsid, rot1d);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- tempmap = viewmap;
- quit = FALSE;
- do
- {
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- pawait_event(0.0, &wsid, &class, &devnum);
- if ((class == PIN_LOC) && (wsid == viewwsid))
- {
- pget_loc(&viewindex, &locpos);
- geninput.inputclass = PIN_LOC;
- geninput.ptkugeninput.locpoint = locpos;
- if (ptk_scanmenus(viewwsid, &geninput, &menuoutput))
- {
- pset_loc_mode(viewwsid, LOCDEV, POP_REQ, PSWITCH_ECHO);
- if (menuoutput.menuid == rot1d)
- {
- if (menuoutput.itemnum == 0)
- do_moverotator(rot1d);
- else
- {
- tempmap.back_plane = viewmap.back_plane;
- switch (menuoutput.itemnum)
- {
- case 1:
- tempmap.back_plane += menuoutput.value.y * movefactor;
- break;
-
- case 2:
- tempmap.back_plane -= (1.0 - menuoutput.value.y) *
- movefactor;
- break;
- }
- if (checkmapping(&tempmap))
- {
- viewmap.back_plane = tempmap.back_plane;
- updatemxvmm();
- updatemxviewvolume();
- updatedcwindow();
- }
- }
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- }
- else
- {
- quit = TRUE;
- }
- }
- } while (!quit);
- }
- ptk_unpostmenu(viewwsid, rot1d);
- } /* do_backplane */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_scalewindow(C(ptksmenuoutput *) menuout, C(Plimit *) window)
- PreANSI(ptksmenuoutput *menuout)
- PreANSI(Plimit *window)
- {
- Ppoint scale;
-
- switch (menuout->itemnum)
- {
- case 1: /* increase y */
- scale = ptk_point(1.0, 1.0 + (menuout->value.y * 0.1));
- break;
-
- case 2: /* decrease y */
- scale = ptk_point(1.0, 1.0 - ((1.0 - menuout->value.y) * 0.1));
- break;
-
- case 3: /* decrease x */
- scale = ptk_point(1.0 - ((1.0 - menuout->value.x) * 0.1), 1.0);
- break;
-
- case 4: /* increase x */
- scale = ptk_point(1.0 + (menuout->value.x * 0.1), 1.0);
- break;
- }
- ptk_scalelimits(&scale, window);
- } /* do_scalewindow */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_shiftwindow(C(ptksmenuoutput *) menuout, C(Plimit *) window)
- PreANSI(ptksmenuoutput *menuout)
- PreANSI(Plimit *window)
- {
- Ppoint shift;
-
- switch (menuout->itemnum)
- {
- case 1: /* increase y */
- shift = ptk_point(0.0, (menuout->value.y * movefactor));
- break;
-
- case 2: /* decrease y */
- shift = ptk_point(0.0, -((1.0 - menuout->value.y) * movefactor));
- break;
-
- case 3: /* decrease x */
- shift = ptk_point(-((1.0 - menuout->value.x) * movefactor), 0.0);
- break;
-
- case 4: /* increase x */
- shift = ptk_point((menuout->value.x * movefactor), 0.0);
- break;
- }
- ptk_shiftlimits(&shift, window);
- } /* do_shiftwindow */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_viewwindow()
- {
- Ppoint locpos;
- ptkboolean quit;
- Pint wsid, devnum, viewindex;
- Pin_class class;
- ptksgeneralinput geninput;
- ptksmenuoutput menuoutput;
- Pview_map3 tempmap;
-
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- if (!inputmode)
- {
- tempmap = viewmap;
- tempmap.win.x_min = ptk_readfloat(viewwsid, 0.0,
- "Input window, xmin (0.0) >", &echoarea);
- tempmap.win.x_max = ptk_readfloat(viewwsid, 1.0,
- "Input window, xmax (1.0) >", &echoarea);
- tempmap.win.y_min = ptk_readfloat(viewwsid, 0.0,
- "Input window, ymin (0.0) >", &echoarea);
- tempmap.win.y_max = ptk_readfloat(viewwsid, 1.0,
- "Input window, ymax (1.0) >", &echoarea);
- if (checkmapping(&tempmap))
- {
- viewmap.win = tempmap.win;
- updatemxviewplane();
- updatemxvmm();
- updatemxviewvolume();
- updatedcwindow();
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- }
- else
- {
- ptk_setrotatortitle(rot2d1, "scale window");
- ptk_setrotatortitle(rot2d2, "shift window");
- ptk_postmenu(viewwsid, rot2d1);
- ptk_postmenu(viewwsid, rot2d2);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- tempmap = viewmap;
- quit = FALSE;
- do
- {
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- pawait_event(0.0, &wsid, &class, &devnum);
- if ((class == PIN_LOC) && (wsid == viewwsid))
- {
- pget_loc(&viewindex, &locpos);
- geninput.inputclass = PIN_LOC;
- geninput.ptkugeninput.locpoint = locpos;
- tempmap.win = viewmap.win;
- if (ptk_scanmenus(viewwsid, &geninput, &menuoutput))
- {
- pset_loc_mode(viewwsid, LOCDEV, POP_REQ, PSWITCH_ECHO);
- if ((menuoutput.menuid == rot2d1) ||
- (menuoutput.menuid == rot2d2))
- {
- if (menuoutput.itemnum == 0)
- do_moverotator(menuoutput.menuid);
- else
- {
- if (menuoutput.menuid == rot2d1)
- do_scalewindow(&menuoutput, &tempmap.win);
- else
- do_shiftwindow(&menuoutput, &tempmap.win);
- if (checkmapping(&tempmap))
- {
- viewmap.win = tempmap.win;
- updatemxviewplane();
- updatemxvmm();
- updatemxviewvolume();
- updatedcwindow();
- }
- }
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- }
- else
- {
- quit = TRUE;
- }
- }
- } while (!quit);
- }
- ptk_unpostmenu(viewwsid, rot2d1);
- ptk_unpostmenu(viewwsid, rot2d2);
- } /* do_viewwindow */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_scaleviewport(C(ptksmenuoutput *) menuout, C(Plimit3 *) vwpt)
- PreANSI(ptksmenuoutput *menuout)
- PreANSI(Plimit3 *vwpt)
- {
- Ppoint3 scale;
-
- switch (menuout->itemnum)
- {
- case 1: /* increase y */
- scale = ptk_point3(1.0, 1.0 + (0.1 * menuout->value.y), 1.0);
- break;
-
- case 2: /* decrease y */
- scale = ptk_point3(1.0, 1.0 - (0.1 * (1.0 - menuout->value.y)), 1.0);
- break;
-
- case 3: /* decrease x */
- scale = ptk_point3(1.0 - (0.1 * (1.0 - menuout->value.x)), 1.0, 1.0);
- break;
-
- case 4: /* increase x */
- scale = ptk_point3(1.0 + (0.1 * menuout->value.x), 1.0, 1.0);
- break;
-
- case 5: /* increase z */
- scale = ptk_point3(1.0, 1.0, 1.0 + (0.1 * menuout->value.y));
- break;
-
- case 6: /* decrease z */
- scale = ptk_point3(1.0, 1.0, 1.0 - (0.1 * menuout->value.y));
- break;
- }
- ptk_scalelimits3(&scale, vwpt);
- } /* do_scaleviewport */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_shiftviewport(C(ptksmenuoutput *) menuout, C(Plimit3 *) vwpt)
- PreANSI(ptksmenuoutput *menuout)
- PreANSI(Plimit3 *vwpt)
- {
- Ppoint3 shift;
- Pfloat shiftfactor;
-
- shiftfactor = 0.1;
- switch (menuout->itemnum)
- {
- case 1: /* increase y */
- shift = ptk_point3(0.0, (menuout->value.y * shiftfactor), 0.0);
- break;
-
- case 2: /* decrease y */
- shift = ptk_point3(0.0, -((1.0 - menuout->value.y) * shiftfactor), 0.0);
- break;
-
- case 3: /* decrease x */
- shift = ptk_point3(-((1.0 - menuout->value.x) * shiftfactor), 0.0, 0.0);
- break;
-
- case 4: /* increase x */
- shift = ptk_point3((menuout->value.x * shiftfactor), 0.0, 0.0);
- break;
-
- case 5: /* increase z */
- shift = ptk_point3(0.0, 0.0, (menuout->value.y * shiftfactor));
- break;
-
- case 6: /* decrease z */
- shift = ptk_point3(0.0, 0.0, -(menuout->value.y * shiftfactor));
- break;
- }
- ptk_shiftlimits3(&shift, vwpt);
- } /* do_shiftviewport */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_projviewport()
- {
- Ppoint locpos;
- ptkboolean projvwptquit;
- Pint wsid, devnum, viewindex;
- Pin_class class;
- ptksgeneralinput geninput;
- ptksmenuoutput menuoutput;
- Pview_map3 tempmap;
-
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- if (!inputmode)
- {
- tempmap = viewmap;
- tempmap.proj_vp.x_min = ptk_readfloat(viewwsid, 0.0,
- "Input viewport, xmin (0.0) >", &echoarea);
- tempmap.proj_vp.x_max = ptk_readfloat(viewwsid, 1.0,
- "Input viewport, xmax (1.0) >", &echoarea);
- tempmap.proj_vp.y_min = ptk_readfloat(viewwsid, 0.0,
- "Input viewport, ymin (0.0) >", &echoarea);
- tempmap.proj_vp.y_max = ptk_readfloat(viewwsid, 1.0,
- "Input viewport, ymax (1.0) >", &echoarea);
- tempmap.proj_vp.z_min = ptk_readfloat(viewwsid, 0.0,
- "Input viewport, zmin (0.0) >", &echoarea);
- tempmap.proj_vp.z_max = ptk_readfloat(viewwsid, 1.0,
- "Input viewport, zmax (1.0) >", &echoarea);
- if (checkmapping(&tempmap))
- {
- viewmap.proj_vp = tempmap.proj_vp;
- updatemxvmm();
- updatemxprojviewport();
- updatedcwindow();
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- }
- else
- {
- ptk_setrotatortitle(rot3d1, "scale viewport");
- ptk_setrotatortitle(rot3d2, "shift viewport");
- ptk_postmenu(viewwsid, rot3d1);
- ptk_postmenu(viewwsid, rot3d2);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- tempmap = viewmap;
- projvwptquit = FALSE;
- do
- {
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- pawait_event(0.0, &wsid, &class, &devnum);
- if ((class == PIN_LOC) && (wsid == viewwsid))
- {
- pget_loc(&viewindex, &locpos);
- geninput.inputclass = PIN_LOC;
- geninput.ptkugeninput.locpoint = locpos;
- tempmap.proj_vp = viewmap.proj_vp;
- if (ptk_scanmenus(viewwsid, &geninput, &menuoutput))
- {
- pset_loc_mode(viewwsid, LOCDEV, POP_REQ, PSWITCH_ECHO);
- if ((menuoutput.menuid == rot3d1) ||
- (menuoutput.menuid == rot3d2))
- {
- if (menuoutput.itemnum == 0)
- do_moverotator(menuoutput.menuid);
- else
- {
- if (menuoutput.menuid == rot3d1)
- do_scaleviewport(&menuoutput, &tempmap.proj_vp);
- else
- do_shiftviewport(&menuoutput, &tempmap.proj_vp);
- if (checkmapping(&tempmap))
- {
- viewmap.proj_vp = tempmap.proj_vp;
- updatemxvmm();
- updatemxprojviewport();
- updatedcwindow();
- }
- }
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- }
- else
- {
- projvwptquit = TRUE;
- }
- }
- } while (!projvwptquit);
- }
- ptk_unpostmenu(viewwsid, rot3d1);
- ptk_unpostmenu(viewwsid, rot3d2);
- } /* do_projviewport */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_projection()
- {
- if (dcopen)
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- if (viewmap.proj_type == PTYPE_PARAL)
- viewmap.proj_type = PTYPE_PERSPECT;
- else
- viewmap.proj_type = PTYPE_PARAL;
- updatemxvmm();
- updatedcwindow();
- } /* do_projection */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_inquire()
- {
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- ptk_printfterminal(terminalwindow, "vrp = %f, %f, %f\n", vrp.x, vrp.y,
- vrp.z);
- ptk_printfterminal(terminalwindow, "vpn = %f, %f, %f\n", vpn.x, vpn.y,
- vpn.z);
- ptk_printfterminal(terminalwindow, "vup = %f, %f, %f\n", vup.x, vup.y,
- vup.z);
- ptk_printfterminal(terminalwindow, "prp = %f, %f, %f\n", viewmap.proj_ref_point.x,
- viewmap.proj_ref_point.y, viewmap.proj_ref_point.z);
- ptk_printfterminal(terminalwindow, "view plane = %f\n",
- viewmap.view_plane);
- ptk_printfterminal(terminalwindow, "front plane = %f\n",
- viewmap.front_plane);
- ptk_printfterminal(terminalwindow, "back plane = %f\n",
- viewmap.back_plane);
- ptk_writelnterminal(terminalwindow, "view window:");
- ptk_printfterminal(terminalwindow, "xmin = %f, xmax = %f\n",
- viewmap.win.x_min, viewmap.win.x_max);
- ptk_printfterminal(terminalwindow, "ymin = %f, ymax = %f\n",
- viewmap.win.y_min, viewmap.win.y_max);
- ptk_writelnterminal(terminalwindow, "projection viewport:");
- ptk_printfterminal(terminalwindow, "xmin = %f, xmax = %f\n",
- viewmap.proj_vp.x_min, viewmap.proj_vp.x_max);
- ptk_printfterminal(terminalwindow, "ymin = %f, ymax = %f\n",
- viewmap.proj_vp.y_min, viewmap.proj_vp.y_max);
- ptk_printfterminal(terminalwindow, "zmin = %f, zmax = %f\n",
- viewmap.proj_vp.z_min, viewmap.proj_vp.z_max);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- } /* do_inquire */
-
- /*--------------------------------------------------------------------------*/
-
- static void makemenus(C(void))
- {
- Pint err;
- Ppoint topleft;
- Ppoint box, size, pos;
-
- /* view menu */
- viewmenuid = ptk_stringtoint("menuid", "ptk$viewmenu");
- box = ptk_point(0.1, 0.05);
- topleft = ptk_point(0.0, 1.0);
- ptk_createboxmenu(viewmenuid, &topleft, &box);
- ptk_setboxmenuattrs(viewwsid, viewmenuid, PPATH_DOWN, menutextfont,
- menutextcolourind, menucolourind,
- bannercolourind, tlcolourind, brcolourind,
- menutextcolourind, menucolourind, menucolourind);
-
- ptk_createtextmenuitem(viewmenuid, "orient'n", 1, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(viewmenuid, "mapping", 2, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(viewmenuid, "clipping", 3, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(viewmenuid, "reset", 4, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(viewmenuid, "keyboard", 5, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(viewmenuid, "inquire", 6, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(viewmenuid, "refresh", 7, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(viewmenuid, "exit", 8, PEDIT_INSERT, &err);
-
- /* view orientation menu */
- orimenuid = ptk_stringtoint("menuid", "ptk$orientationmenu");
- box = ptk_point(0.1, 0.05);
- topleft = ptk_point(0.0, 1.0);
- ptk_createboxmenu(orimenuid, &topleft, &box);
- ptk_setboxmenuattrs(viewwsid, orimenuid, PPATH_DOWN, menutextfont,
- menutextcolourind, menucolourind,
- bannercolourind, tlcolourind, brcolourind,
- menutextcolourind, menucolourind, menucolourind);
-
- ptk_createtextmenuitem(orimenuid, "vrp", 1, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(orimenuid, "vpn", 2, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(orimenuid, "vup", 3, PEDIT_INSERT, &err);
-
- /* view clipping menu */
- clipmenuid = ptk_stringtoint("menuid", "ptk$clippingmenu");
- box = ptk_point(0.1, 0.05);
- topleft = ptk_point(0.0, 1.0);
- ptk_createboxmenu(clipmenuid, &topleft, &box);
- ptk_setboxmenuattrs(viewwsid, clipmenuid, PPATH_DOWN, menutextfont,
- menutextcolourind, menucolourind,
- bannercolourind, tlcolourind, brcolourind,
- menutextcolourind, menucolourind, menucolourind);
-
- ptk_createtextmenuitem(clipmenuid, "x-y ON", 1, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(clipmenuid, "front ON", 2, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(clipmenuid, "back ON", 3, PEDIT_INSERT, &err);
-
- /* view mapping menu */
- mapmenuid = ptk_stringtoint("menuid", "ptk$mappingmenu");
- box = ptk_point(0.1, 0.05);
- topleft = ptk_point(0.0, 1.0);
- ptk_createboxmenu(mapmenuid, &topleft, &box);
- ptk_setboxmenuattrs(viewwsid, mapmenuid, PPATH_DOWN, menutextfont,
- menutextcolourind, menucolourind,
- bannercolourind, tlcolourind, brcolourind,
- menutextcolourind, menucolourind, menucolourind);
-
- ptk_createtextmenuitem(mapmenuid, "prp", 1, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(mapmenuid, "front pl.", 2, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(mapmenuid, "back pl.", 3, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(mapmenuid, "view pl.", 4, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(mapmenuid, "window", 5, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(mapmenuid, "viewport", 6, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(mapmenuid, "perspective", 7, PEDIT_INSERT, &err);
-
- /* window menu */
- windowmenuid = ptk_stringtoint("menuid", "ptk$windowmenu");
- box = ptk_point(0.1, 0.05);
- topleft = ptk_point(0.0, 1.0);
- ptk_createboxmenu(windowmenuid, &topleft, &box);
- ptk_setboxmenuattrs(viewwsid, windowmenuid, PPATH_DOWN, menutextfont,
- menutextcolourind, menucolourind,
- bannercolourind, tlcolourind, brcolourind,
- menutextcolourind, menucolourind, menucolourind);
-
- ptk_createtextmenuitem(windowmenuid, "close", 1, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(windowmenuid, "move", 2, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(windowmenuid, "resize", 3, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(windowmenuid, "front", 4, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(windowmenuid, "back", 5, PEDIT_INSERT, &err);
- ptk_createtextmenuitem(windowmenuid, "camera", 6, PEDIT_INSERT, &err);
-
- /* camera interface */
-
- /* rotators */
- rot3d1 = ptk_stringtoint("menuid", "ptk$rotator3d1");
- rot3d2 = ptk_stringtoint("menuid", "ptk$rotator3d2");
- rot2d1 = ptk_stringtoint("menuid", "ptk$rotator2d1");
- rot2d2 = ptk_stringtoint("menuid", "ptk$rotator2d2");
- rot1d = ptk_stringtoint("menuid", "ptk$rotator1d");
- rot3d1pos = ptk_point(0.15, 0.88);
- rot3d2pos = ptk_point(0.15, 0.66);
- rot2d1pos = ptk_point(0.1, 0.88);
- rot2d2pos = ptk_point(0.1, 0.66);
- rot1dpos = ptk_point(0.1, 0.66);
- size = ptk_point(0.3, 0.2);
- ptk_createrotator(viewwsid, rot3d1, PTKETHREED, &size, "rotator",
- 0.02);
- ptk_setrotatorattrs(viewwsid, rot3d1, windowtextfont, bannertextcolourind,
- arrowcolourind, arrowedgecolourind,
- windowcolourind, bannercolourind,
- bannercolourind, tlcolourind, brcolourind);
- ptk_createrotator(viewwsid, rot3d2, PTKETHREED, &size, "rotator",
- 0.02);
- ptk_setrotatorattrs(viewwsid, rot3d2, windowtextfont, bannertextcolourind,
- arrowcolourind, arrowedgecolourind,
- windowcolourind, bannercolourind,
- bannercolourind, tlcolourind, brcolourind);
- size = ptk_point(0.2, 0.2);
- ptk_createrotator(viewwsid, rot2d1, PTKETWOD, &size, "rotator",
- 0.02);
- ptk_setrotatorattrs(viewwsid, rot2d1, windowtextfont, bannertextcolourind,
- arrowcolourind, arrowedgecolourind,
- windowcolourind, bannercolourind,
- bannercolourind, tlcolourind, brcolourind);
- ptk_createrotator(viewwsid, rot2d2, PTKETWOD, &size, "rotator",
- 0.02);
- ptk_setrotatorattrs(viewwsid, rot2d2, windowtextfont, bannertextcolourind,
- arrowcolourind, arrowedgecolourind,
- windowcolourind, bannercolourind,
- bannercolourind, tlcolourind, brcolourind);
- ptk_createrotator(viewwsid, rot1d, PTKEONED, &size, "rotator",
- 0.02);
- ptk_setrotatorattrs(viewwsid, rot1d, windowtextfont, bannertextcolourind,
- arrowcolourind, arrowedgecolourind,
- windowcolourind, bannercolourind,
- bannercolourind, tlcolourind, brcolourind);
- ptk_setmenuposition(rot3d1, &rot3d1pos);
- ptk_setmenuposition(rot3d2, &rot3d2pos);
- ptk_setmenuposition(rot2d1, &rot2d1pos);
- ptk_setmenuposition(rot2d2, &rot2d2pos);
- ptk_setmenuposition(rot1d, &rot1dpos);
- } /* makemenus */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_scrollterminal()
- {
- ptkboolean quit;
- Pint ws, devnum;
- Pin_class class;
- Ppoint position;
- Pint view_index;
- ptksgeneralinput geninput;
- ptksmenuoutput menuoutput;
- Ploc_data locrec;
- Ptext_path direction;
- Pint numlines, maxlines, maxcolumns, txfont, txcolour, err;
-
- ptk_setrotatortitle(rot1d, "scroll terminal");
- ptk_postmenu(viewwsid, rot1d);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- quit = FALSE;
- ptk_inqterminaldata(terminalwindow, &maxlines, &maxcolumns, &txfont,
- &txcolour, &err);
- do
- {
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- pawait_event(0.0, &ws, &class, &devnum);
- if ((class == PIN_LOC) && (ws == viewwsid))
- {
- pget_loc(&view_index, &position);
- geninput.inputclass = PIN_LOC;
- geninput.ptkugeninput.locpoint = position;
- if (ptk_scanmenus(viewwsid, &geninput, &menuoutput))
- {
- pset_loc_mode(viewwsid, LOCDEV, POP_REQ, PSWITCH_ECHO);
- if (menuoutput.menuid == rot1d)
- {
- if (menuoutput.itemnum == 0)
- do_moverotator(rot1d);
- else
- {
- switch (menuoutput.itemnum)
- {
- case 1:
- direction = PPATH_DOWN;
- numlines = (Pint)(menuoutput.value.y * (Pfloat)maxlines);
- break;
-
- case 2:
- direction = PPATH_UP;
- numlines = (Pint)((1.0 - menuoutput.value.y) *
- (Pfloat)maxlines);
- break;
- }
- ptk_scrollterminal(terminalwindow, direction, numlines);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- }
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- }
- else
- {
- quit = TRUE;
- }
- }
- } while (!quit);
- ptk_unpostmenu(viewwsid, rot1d);
- } /* do_scrollterminal */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_spincamera(C(Pint) windid, C(ptksmenuoutput *) menuout)
- PreANSI(Pint windid)
- PreANSI(ptksmenuoutput *menuout)
- {
- Pfloat angle;
-
- switch (menuout->itemnum)
- {
- case 1:
- angle = menuout->value.y * 10.0;
- ptk_rotatepositionxaxis(windid, angle);
- break;
-
- case 2:
- angle = (1.0 - menuout->value.y) * 10.0;
- ptk_rotatepositionxaxis(windid, -angle);
- break;
-
- case 3:
- angle = (1.0 - menuout->value.x) * 10.0;
- ptk_rotatepositionyaxis(windid, angle);
- break;
-
- case 4:
- angle = menuout->value.x * 10.0;
- ptk_rotatepositionyaxis(windid, -angle);
- break;
-
- case 5:
- angle = menuout->value.y * 10.0;
- ptk_rotatecameraupvector(windid, angle);
- break;
-
- case 6:
- angle = menuout->value.y * 10.0;
- ptk_rotatecameraupvector(windid, -angle);
- break;
- }
- } /* do_spincamera */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_zoompancamera(C(Pint) windid, C(ptksmenuoutput *) menuout)
- PreANSI(Pint windid)
- PreANSI(ptksmenuoutput *menuout)
- {
- Pfloat zoomfactor, xsize, ysize;
- Ppoint3 shift;
- Plimit3 limits;
- Pint err;
-
- ptk_inqcameralimits(windid, &limits, &err);
- xsize = limits.x_max - limits.x_min;
- ysize = limits.y_max - limits.y_min;
- xsize /= 2.0;
- ysize /= 2.0;
- switch (menuout->itemnum)
- {
- case 1:
- shift = ptk_point3(0.0, menuout->value.y * ysize, 0.0);
- ptk_shiftcamera(windid, &shift);
- break;
-
- case 2:
- shift = ptk_point3(0.0, -(1.0 - menuout->value.y) * ysize, 0.0);
- ptk_shiftcamera(windid, &shift);
- break;
-
- case 3:
- shift = ptk_point3(-(1.0 - menuout->value.x) * xsize, 0.0, 0.0);
- ptk_shiftcamera(windid, &shift);
- break;
-
- case 4:
- shift = ptk_point3(menuout->value.x * xsize, 0.0, 0.0);
- ptk_shiftcamera(windid, &shift);
- break;
-
- case 5:
- zoomfactor = menuout->value.y * 0.1;
- ptk_scaleviewwindow(windid, 1.0 - zoomfactor);
- break;
-
- case 6:
- zoomfactor = menuout->value.y * 0.1;
- ptk_scaleviewwindow(windid, 1.0 + zoomfactor);
- break;
- }
- } /* do_zoompancamera */
-
- /*--------------------------------------------------------------------------*/
-
- static void camerainterface(C(Pint) windid)
- PreANSI(Pint windid)
- {
- Ppoint locpos;
- ptkboolean cameraquit;
- Pint wsid, devnum, viewindex;
- Pin_class class;
- ptksgeneralinput geninput;
- ptksmenuoutput menuoutput;
- Ploc_data locrec;
-
- ptk_setrotatortitle(rot3d1, "rotate");
- ptk_setrotatortitle(rot3d2, "zoom + pan");
- ptk_postmenu(viewwsid, rot3d1);
- ptk_postmenu(viewwsid, rot3d2);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- cameraquit = FALSE;
- do
- {
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- pawait_event(0.0, &wsid, &class, &devnum);
- if ((class == PIN_LOC) && (wsid == viewwsid))
- {
- pget_loc(&viewindex, &locpos);
- geninput.inputclass = PIN_LOC;
- geninput.ptkugeninput.locpoint = locpos;
- if (ptk_scanmenus(viewwsid, &geninput, &menuoutput))
- {
- pset_loc_mode(viewwsid, LOCDEV, POP_REQ, PSWITCH_ECHO);
- if (menuoutput.menuid == rot3d1)
- {
- if (menuoutput.itemnum == 0)
- do_moverotator(rot3d1);
- else
- do_spincamera(windid, &menuoutput);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- else
- if (menuoutput.menuid == rot3d2)
- {
- if (menuoutput.itemnum == 0)
- do_moverotator(rot3d2);
- else
- do_zoompancamera(windid, &menuoutput);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- }
- else
- {
- cameraquit = TRUE;
- }
- }
- } while (!cameraquit);
- ptk_unpostmenu(viewwsid, rot3d1);
- ptk_unpostmenu(viewwsid, rot3d2);
- } /* camerainterface */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_orimenu(C(Pint) menuitem)
- PreANSI(Pint menuitem)
- {
- ptk_unpostallmenu(viewwsid);
- switch (menuitem)
- {
- case 1: /* view reference point */
- do_vrp();
- break;
-
- case 2: /* view plane normal */
- do_vpn();
- break;
-
- case 3: /* view up vector */
- do_vup();
- break;
- }
- curmenu = 0;
- } /* do_orimenu */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_clipmenu(C(Pint) menuitem)
- PreANSI(Pint menuitem)
- {
- Pint err;
-
- switch (menuitem)
- {
- case 1:
- if (clipxy == PIND_NO_CLIP)
- {
- ptk_createtextmenuitem(clipmenuid, "x-y OFF", 1, PEDIT_REPLACE, &err);
- clipxy = PIND_CLIP;
- }
- else
- {
- ptk_createtextmenuitem(clipmenuid, "x-y ON", 1, PEDIT_REPLACE, &err);
- clipxy = PIND_NO_CLIP;
- }
- break;
-
- case 2:
- if (clipfront == PIND_NO_CLIP)
- {
- ptk_createtextmenuitem(clipmenuid, "front OFF", 2, PEDIT_REPLACE, &err);
- clipfront = PIND_CLIP;
- }
- else
- {
- ptk_createtextmenuitem(clipmenuid, "front ON", 2, PEDIT_REPLACE, &err);
- clipfront = PIND_NO_CLIP;
- }
- break;
-
- case 3:
- if (clipback == PIND_NO_CLIP)
- {
- ptk_createtextmenuitem(clipmenuid, "back OFF", 3, PEDIT_REPLACE, &err);
- clipback = PIND_CLIP;
- }
- else
- {
- ptk_createtextmenuitem(clipmenuid, "back ON", 3, PEDIT_REPLACE, &err);
- clipback = PIND_NO_CLIP;
- }
-
- break;
- }
- ptk_setviewclipping3(dcwindow, &viewmap.proj_vp, clipxy, clipfront,
- clipback);
- } /* do_clipmenu */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_mapmenu(C(Pint) menuitem)
- PreANSI(Pint menuitem)
- {
- Pint err;
-
- if (menuitem != 7)
- {
- ptk_unpostallmenu(viewwsid);
- curmenu = 0;
- }
- switch (menuitem)
- {
- case 1: /* prp */
- do_prp();
- break;
-
- case 2: /* front plane distance */
- do_frontplane();
- break;
-
- case 3: /* back plane distance */
- do_backplane();
- break;
-
- case 4: /* view plane distance */
- do_viewplane();
- break;
-
- case 5: /* view window limits */
- do_viewwindow();
- break;
-
- case 6: /* projection viewport limits */
- do_projviewport();
- break;
-
- case 7: /* projection type */
- do_projection();
- if (viewmap.proj_type == PTYPE_PARAL)
- ptk_createtextmenuitem(mapmenuid, "perspective", 7, PEDIT_REPLACE,
- &err);
- else
- ptk_createtextmenuitem(mapmenuid, "parallel", 7, PEDIT_REPLACE, &err);
- break;
- }
- } /* do_mapmenu */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_viewmenu(C(Pint) menuitem, C(Ppoint *) pos)
- PreANSI(Pint menuitem)
- PreANSI(Ppoint *pos)
- {
- Pint err;
- Pfloat maxscenevol;
-
- switch (menuitem)
- {
- case 1: /* orientation */
- ptk_setmenuposition(orimenuid, pos);
- ptk_postmenu(viewwsid, orimenuid);
- ptk_unpostmenu(viewwsid, mapmenuid);
- ptk_unpostmenu(viewwsid, clipmenuid);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- break;
-
- case 2: /* mapping */
- ptk_setmenuposition(mapmenuid, pos);
- ptk_postmenu(viewwsid, mapmenuid);
- ptk_unpostmenu(viewwsid, orimenuid);
- ptk_unpostmenu(viewwsid, clipmenuid);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- break;
-
- case 3: /* clipping */
- ptk_setmenuposition(clipmenuid, pos);
- ptk_postmenu(viewwsid, clipmenuid);
- ptk_unpostmenu(viewwsid, mapmenuid);
- ptk_unpostmenu(viewwsid, orimenuid);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- break;
-
- case 4: /* reset */
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- vpn = ptk_point3(0.0, 0.0, 1.0);
- vup = ptk_point3(0.0, 1.0, 0.0);
- viewmap.view_plane = 0.0;
- viewmap.proj_type = PTYPE_PARAL;
- maxscenevol = PTKMAX(scenevol.x, scenevol.y);
- maxscenevol = PTKMAX(maxscenevol, scenevol.z);
- maxscenevol *= 2.0;
- viewmap.proj_vp = ptk_limit3(0.5 - scenevol.x / maxscenevol,
- 0.5 + scenevol.x / maxscenevol,
- 0.5 - scenevol.y / maxscenevol,
- 0.5 + scenevol.y / maxscenevol,
- 0.5 - scenevol.z / maxscenevol,
- 0.5 + scenevol.z / maxscenevol);
- vrp = initvrp;
- viewmap.win = ptk_limit(-scenevol.x / 2.0, scenevol.x / 2.0,
- -scenevol.y / 2.0, scenevol.y / 2.0);
- viewmap.proj_ref_point = ptk_point3(0.0, 0.0, scenevol.z);
- viewmap.front_plane = scenevol.z / 2.0;
- viewmap.back_plane = -scenevol.z / 2.0;
- clipxy = PIND_NO_CLIP;
- clipfront = PIND_NO_CLIP;
- clipback = PIND_NO_CLIP;
- updatemxvom();
- updatemxinvvom();
- updatemxvmm();
- updatemxviewvolume();
- updatemxprojviewport();
- updatemxviewplane();
- updatemxprp();
- updatedcwindow();
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- break;
-
- case 5: /* keyboard or rotator input */
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- if (inputmode)
- {
- /* change to keyboard mode */
- ptk_createtextmenuitem(viewmenuid, "rotator", 5, PEDIT_REPLACE, &err);
- inputmode = FALSE;
- }
- else
- {
- /* change to rotator input */
- ptk_createtextmenuitem(viewmenuid, "keyboard", 5, PEDIT_REPLACE,
- &err);
- inputmode = TRUE;
- }
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- break;
-
- case 6: /* inquire viewing values */
- do_inquire();
- break;
-
- case 7: /* refresh */
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- predraw_all_structs(viewwsid, PFLAG_ALWAYS);
- break;
- }
- } /* do_viewmenu */
-
- /*--------------------------------------------------------------------------*/
-
- static void do_windowmenu(C(Pint) menuitem, C(ptkswindowoutput *) windoutput)
- PreANSI(Pint menuitem)
- PreANSI(ptkswindowoutput *windoutput)
- {
- ptkboolean closed;
- Ppoint initpt, locpos;
- Plimit echo;
- Ploc_data locrec;
- Pint err, initview, viewindex;
- Pin_status status;
-
- if (windoutput->windowarea == PTKEWINDOWICON)
- closed = TRUE;
- else
- closed = FALSE;
- echo = ptk_limit(0.0, maxdevx, 0.0, maxdevy);
- switch (menuitem)
- {
- case 1: /* open/close */
- ptk_unpostmenu(viewwsid, windowmenuid);
- if (closed)
- {
- if (windoutput->windowid == dcwindow)
- dcopen = TRUE;
- ptk_openwindow(windoutput->windowid);
- }
- else
- {
- if (windoutput->windowid == dcwindow)
- dcopen = FALSE;
- ptk_closewindow(windoutput->windowid);
- }
- break;
-
- case 2: /* move */
- {
- initview = 0;
- if (closed)
- ptk_inqiconposition(windoutput->windowid, &initpt, &err);
- else
- ptk_inqwindowposition(windoutput->windowid, &initpt, &err);
- /* Implementation dependent - locator data record */
- #ifdef HP
- locrec.pets.pet_r1.loc_colr_ind = 1;
- #endif
- pinit_loc(viewwsid, LOCDEV, initview, &initpt, 1, &echo, &locrec);
- pset_loc_mode(viewwsid, LOCDEV, POP_REQ, PSWITCH_ECHO);
- preq_loc(viewwsid, LOCDEV, &status, &viewindex, &locpos);
- if (status == PIN_STATUS_OK)
- if (closed)
- ptk_seticonposition(windoutput->windowid, &locpos);
- else
- {
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- ptk_setwindowposition(windoutput->windowid, &locpos);
- }
- }
- ptk_unpostmenu(viewwsid, windowmenuid);
- break;
-
- case 3: /* resize */
- {
- Pfloat width, height;
- Ppoint size;
-
- initview = 0;
- if (closed)
- ptk_inqiconposition(windoutput->windowid, &initpt, &err);
- else
- ptk_inqwindowposition(windoutput->windowid, &initpt, &err);
-
- /* Implementation dependent code to give
- ** rubber banding rectangle (locator pet)
- */
- #ifdef SUN
- locrec.pets.pet_u5.line_bundle.type = PLINE_SOLID;
- locrec.pets.pet_u5.line_bundle.width = 1.0;
- locrec.pets.pet_u5.line_bundle.colr_ind = 1;
- pinit_loc(viewwsid, LOCDEV, initview, &initpt, -5, &echo, &locrec);
- #endif
- #ifdef HP
- locrec.pets.pet_r5.line_fill_ctrl_flag = PFLAG_LINE;
- locrec.pets.pet_r5.attrs.line_attrs.type_asf = PASF_INDIV;
- locrec.pets.pet_r5.attrs.line_attrs.width_asf = PASF_INDIV;
- locrec.pets.pet_r5.attrs.line_attrs.colr_ind_asf = PASF_INDIV;
- locrec.pets.pet_r5.attrs.line_attrs.bundle.type = PLINE_SOLID;
- locrec.pets.pet_r5.attrs.line_attrs.bundle.width = 1.0;
- locrec.pets.pet_r5.attrs.line_attrs.bundle.colr_ind = 1;
- pinit_loc(viewwsid, LOCDEV, initview, &initpt, 5, &echo, &locrec);
- #endif
- #ifdef PEXSI
- pinit_loc(viewwsid, LOCDEV, initview, &initpt, 1, &echo, &locrec);
- #endif
- pset_loc_mode(viewwsid, LOCDEV, POP_REQ, PSWITCH_ECHO);
- preq_loc(viewwsid, LOCDEV, &status, &viewindex, &locpos);
- if (status == PIN_STATUS_OK)
- {
- width = PTKMAX(initpt.x, locpos.x) - PTKMIN(initpt.x, locpos.x);
- height = PTKMAX(initpt.y, locpos.y) - PTKMIN(initpt.y, locpos.y);
- width *= 2.0;
- height *= 2.0;
- size = ptk_point(width, height);
- if (closed)
- ptk_seticonsize(windoutput->windowid, &size);
- else
- {
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- ptk_setwindowsize(windoutput->windowid, &size);
- }
- }
- /* Implementation dependent - locator data record */
- #ifdef HP
- locrec.pets.pet_r1.loc_colr_ind = 1;
- #endif
- pinit_loc(viewwsid, LOCDEV, initview, &initpt, 1, &echo, &locrec);
- }
- ptk_unpostmenu(viewwsid, windowmenuid);
- break;
-
- case 4: /* front */
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- ptk_unpostmenu(viewwsid, windowmenuid);
- ptk_frontwindow(windoutput->windowid);
- break;
-
- case 5: /* back */
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_NIVE);
- ptk_unpostmenu(viewwsid, windowmenuid);
- ptk_backwindow(windoutput->windowid);
- break;
-
- case 6: /* camera or scroll */
- ptk_unpostmenu(viewwsid, windowmenuid);
- if (windoutput->windowid == terminalwindow)
- do_scrollterminal();
- else
- camerainterface(windoutput->windowid);
- break;
- }
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- } /* do_windowmenu */
-
- /*--------------------------------------------------------------------------*/
-
- static void viewmainloop()
- {
- ptkboolean viewquit;
- Pint wsid, devnum, initview, viewindex;
- Pin_class class;
- Ppoint initpt, locpos;
- ptksgeneralinput geninput;
- ptksmenuoutput menuoutput;
- ptkswindowoutput windowoutput;
- Ploc_data locrec;
- Plimit echo;
-
- viewquit = FALSE;
- pset_loc_mode(viewwsid, LOCDEV, POP_REQ, PSWITCH_ECHO);
- initview = 0;
- initpt = ptk_point(0.5, 0.5);
- echo = ptk_limit(0.0, maxdevx, 0.0, maxdevy);
- /* Implementation dependent - locator data record */
- #ifdef HP
- locrec.pets.pet_r1.loc_colr_ind = 1;
- #endif
- pflush_events(viewwsid, PIN_LOC, LOCDEV);
- pinit_loc(viewwsid, LOCDEV, initview, &initpt, 1, &echo, &locrec);
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- do
- {
- pset_disp_upd_st(viewwsid, PDEFER_WAIT, PMODE_UQUM);
- pawait_event(0.0, &wsid, &class, &devnum);
- if ((class == PIN_LOC) && (wsid == viewwsid))
- {
- pget_loc(&viewindex, &locpos);
- geninput.inputclass = PIN_LOC;
- geninput.ptkugeninput.locpoint = locpos;
- if (ptk_scanmenus(viewwsid, &geninput, &menuoutput))
- {
- pset_loc_mode(viewwsid, LOCDEV, POP_REQ, PSWITCH_ECHO);
- if (menuoutput.menuid == orimenuid)
- {
- do_orimenu(menuoutput.itemnum);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- else
- if (menuoutput.menuid == mapmenuid)
- {
- do_mapmenu(menuoutput.itemnum);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- else
- if (menuoutput.menuid == clipmenuid)
- {
- do_clipmenu(menuoutput.itemnum);
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- else
- if (menuoutput.menuid == viewmenuid)
- {
- if (menuoutput.itemnum == 8)
- viewquit = TRUE;
- else
- do_viewmenu(menuoutput.itemnum, &locpos);
- }
- else
- if (menuoutput.menuid == windowmenuid)
- {
- do_windowmenu(menuoutput.itemnum, &windowoutput);
- curmenu = 0;
- }
- pset_loc_mode(viewwsid, LOCDEV, POP_EVENT, PSWITCH_ECHO);
- }
- else
- if (ptk_scanwindows(viewwsid, &geninput, &windowoutput))
- {
- Pint err;
-
- ptk_unpostallmenu(viewwsid);
- if (windowoutput.windowarea == PTKEWINDOWICON)
- ptk_createtextmenuitem(windowmenuid, "open", 1, PEDIT_REPLACE, &err);
- else
- ptk_createtextmenuitem(windowmenuid, "close", 1, PEDIT_REPLACE, &err);
- if (windowoutput.windowid == dcwindow)
- ptk_delmenuitem(windowmenuid, 6);
- else
- if (windowoutput.windowid == terminalwindow)
- {
- ptkewindowstate state;
-
- ptk_inqwindowstate(terminalwindow, &state, &err);
- if (state == PTKEWINDOWOPEN)
- ptk_createtextmenuitem(windowmenuid, "scroll", 6, PEDIT_REPLACE,
- &err);
- else
- ptk_delmenuitem(windowmenuid, 6);
- }
- else
- ptk_createtextmenuitem(windowmenuid, "camera", 6, PEDIT_REPLACE,
- &err);
- if ((curmenu != windowmenuid) || (curwindow != windowoutput.windowid))
- {
- ptk_setmenuposition(windowmenuid, &locpos);
- ptk_postmenu(viewwsid, windowmenuid);
- curwindow = windowoutput.windowid;
- curmenu = windowmenuid;
- }
- else
- {
- curwindow = 0;
- curmenu = 0;
- }
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- else
- {
- curwindow = 0;
- ptk_unpostallmenu(viewwsid);
- if (curmenu != viewmenuid)
- {
- ptk_setmenuposition(viewmenuid, &locpos);
- ptk_postmenu(viewwsid, viewmenuid);
- curmenu = viewmenuid;
- }
- else
- curmenu = 0;
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
- }
- }
- } while (!viewquit);
- pflush_events(viewwsid, PIN_LOC, LOCDEV);
- } /* viewmainloop */
-
- /*--------------------------------------------------------------------------*/
-
- /*function:external*/
- extern void ptk_vieweditor(C(Pint) wsid, C(Pint_list *) stids,
- C(Pview_rep3 *) rep)
- PreANSI(Pint wsid)
- PreANSI(Pint_list *stids)
- PreANSI(Pview_rep3 *rep)
- /*
- ** \parambegin
- ** \param{Pint}{wsid}{workstation identifier}{IN}
- ** \param{Pint\_list *}{stids}{list of structure identifiers}{IN}
- ** \param{Pview\_rep3 *}{rep}{view representation}{OUT}
- ** \paramend
- ** \blurb{This function starts the interactive PHIGS view editor, on
- ** workstation \pardesc{ws}.
- ** This function requires hashtables
- ** "structureid", "label", "name", "viewindex", "topologyid", "menuid",
- ** "windowid".}
- */
- {
- Ppoint pos, size;
- Pint lenstr, err, stcom, totsize, i;
- Pint_list pmenus, pwindows;
- Pposted_struct_list structs;
- Pdefer_mode defmode;
- Pmod_mode modmode;
- Pdisp_surf_empty dspsurf;
- Pvisual_st visualrep;
- Pcolr_rep backrep;
-
- viewscene = ptk_stringtoint("structureid", "ptk$viewscene");
- if (!do_scene(stids))
- {
- fprintf(stderr, "View editor: the given scene cannot be viewed.\n");
- return;
- }
-
- /* inquire and set display update state */
- pinq_disp_upd_st(wsid, &err, &defmode, &modmode, &dspsurf, &visualrep);
- pset_disp_upd_st(wsid, PDEFER_WAIT, PMODE_NIVE);
-
- /* inquire and set background colour */
- pinq_colr_rep(wsid, 0, PINQ_SET, &err, &backrep);
- ptk_setbackgroundcolourind(wsid, backgroundcolourind);
-
- /* inquire all posted menus and windows */
- ptk_inqpostedmenus(wsid, 0, &pmenus, &totsize, &err);
- pmenus.ints = (Pint *)calloc(totsize, sizeof(Pint));
- ptk_inqpostedmenus(wsid, totsize, &pmenus, &totsize, &err);
- pmenus.num_ints = totsize;
- ptk_inqpostedwindows(wsid, 0, &pwindows, &totsize, &err);
- pwindows.ints = (Pint *)calloc(totsize, sizeof(Pint));
- ptk_inqpostedwindows(wsid, totsize, &pwindows, &totsize, &err);
- pwindows.num_ints = totsize;
- /* clear menus and windows */
- for (i = 0; i < pmenus.num_ints; i++)
- ptk_unpostmenu(wsid, pmenus.ints[i]);
- for (i = 0; i < pwindows.num_ints; i++)
- ptk_unpostwindow(wsid, pwindows.ints[i]);
-
- /* inquire all other posted structure */
- pinq_posted_structs(wsid, 0, 0, &err, &structs, &totsize);
- structs.postings = (Pposted_struct *)calloc(totsize, sizeof(Pposted_struct));
- pinq_posted_structs(wsid, totsize, 0, &err, &structs, &totsize);
- structs.num_postings = totsize;
- /* clear all posted structures */
- punpost_all_structs(wsid);
-
- /* clear workstation */
-
- viewwsid = wsid;
- ptk_inqmaxdevicecoords(wsid, &maxdevx, &maxdevy);
- echoarea = ptk_limit(0.0, maxdevx * 0.5, 0.0, maxdevy * 0.05);
- /* set up windows */
- pos = ptk_point(0.25, 0.25);
- size = ptk_point(0.45, 0.45);
-
- wcwindow = ptk_stringtoint("windowid", "ptk$wcwindow");
- vrcwindow = ptk_stringtoint("windowid", "ptk$vrcwindow");
- npcwindow = ptk_stringtoint("windowid", "ptk$npcwindow");
- dcwindow = ptk_stringtoint("windowid", "ptk$dcwindow");
- terminalwindow = ptk_stringtoint("windowid", "ptk$terminalwindow");
- viewscene = ptk_stringtoint("structureid", "ptk$viewscene");
- wcscene = ptk_stringtoint("structureid", "ptk$viewwcscene");
- vrcscene = ptk_stringtoint("structureid", "ptk$viewvrcscene");
- npcscene = ptk_stringtoint("structureid", "ptk$viewnpcscene");
- dcscene = ptk_stringtoint("structureid", "ptk$viewdcscene");
- ptk_createwindow(wsid, wcwindow, &size, &pos, "world coords");
- ptk_setwindowattrs(wcwindow, windowtextfont, bannertextcolourind,
- bannercolourind, windowcolourind,
- bannercolourind, tlcolourind, brcolourind);
- pos = ptk_point(0.25, 0.75);
- ptk_createwindow(wsid, vrcwindow, &size, &pos, "view reference coords");
- ptk_setwindowattrs(vrcwindow, windowtextfont, bannertextcolourind,
- bannercolourind, windowcolourind,
- bannercolourind, tlcolourind, brcolourind);
- pos = ptk_point(0.75, 0.75);
- ptk_createwindow(wsid, npcwindow, &size, &pos,
- "normalised projection coords");
- ptk_setwindowattrs(npcwindow, windowtextfont, bannertextcolourind,
- bannercolourind, windowcolourind,
- bannercolourind, tlcolourind, brcolourind);
- pos = ptk_point(0.75, 0.25);
- ptk_createwindow(wsid, dcwindow, &size, &pos, "device coords");
- ptk_setwindowattrs(dcwindow, windowtextfont, bannertextcolourind,
- bannercolourind, windowcolourind,
- bannercolourind, tlcolourind, brcolourind);
- pos = ptk_point(0.5, 0.5);
- ptk_createwindow(wsid, terminalwindow, &size, &pos, "terminal");
- ptk_setwindowattrs(terminalwindow, windowtextfont, bannertextcolourind,
- bannercolourind, windowcolourind,
- bannercolourind, tlcolourind, brcolourind);
- ptk_setwindowtype(terminalwindow, PTKETERMINALWINDOW);
- ptk_postwindow(wcwindow);
- ptk_postwindow(vrcwindow);
- ptk_postwindow(npcwindow);
- ptk_postwindow(dcwindow);
- ptk_postwindow(terminalwindow);
- ptk_closewindow(terminalwindow);
-
- /* set up menus */
- makemenus();
-
- makeviewstructs();
-
- initialiseeditor();
-
- updatemxvom();
- updatemxinvvom();
- updatemxvmm();
- updatemxviewvolume();
- updatemxprojviewport();
- updatemxprp();
- updatemxviewplane();
-
- updatewindows();
- ptk_redrawallstructs(viewwsid, PFLAG_ALWAYS);
-
- /* interaction loop */
- viewmainloop();
-
- pset_disp_upd_st(wsid, PDEFER_WAIT, PMODE_NIVE);
-
- /* tidy up before exit */
- /* delete windows */
- ptk_delwindow(wcwindow);
- ptk_delwindow(vrcwindow);
- ptk_delwindow(npcwindow);
- ptk_delwindow(dcwindow);
- ptk_delwindow(terminalwindow);
-
- ptk_delstring("windowid", "ptk$wcwindow");
- ptk_delstring("windowid", "ptk$vrcwindow");
- ptk_delstring("windowid", "ptk$npcwindow");
- ptk_delstring("windowid", "ptk$dcwindow");
- ptk_delstring("windowid", "ptk$terminalwindow");
-
- /* reset view editor variables */
- clipxy = PIND_NO_CLIP;
- clipfront = PIND_NO_CLIP;
- clipback = PIND_NO_CLIP;
- curmenu = 0;
- curwindow = 0;
- inputmode = TRUE;
- dcopen = TRUE;
-
- /* delete menus */
- ptk_delmenu(viewmenuid);
- ptk_delmenu(orimenuid);
- ptk_delmenu(mapmenuid);
- ptk_delmenu(windowmenuid);
- ptk_delmenu(clipmenuid);
-
- ptk_delstring("menuid", "ptk$viewmenu");
- ptk_delstring("menuid", "ptk$orientationmenu");
- ptk_delstring("menuid", "ptk$mappingmenu");
- ptk_delstring("menuid", "ptk$windowmenu");
- ptk_delstring("menuid", "ptk$clippingmenu");
-
- /* delete rotators */
- ptk_delmenu(rot3d1);
- ptk_delmenu(rot3d2);
- ptk_delmenu(rot2d1);
- ptk_delmenu(rot2d2);
- ptk_delmenu(rot1d);
-
- ptk_delstring("menuid", "ptk$rotator3d1");
- ptk_delstring("menuid", "ptk$rotator3d2");
- ptk_delstring("menuid", "ptk$rotator2d1");
- ptk_delstring("menuid", "ptk$rotator2d2");
- ptk_delstring("menuid", "ptk$rotator1d");
-
- /* delete view editor structures */
- pdel_struct(wcaxes);
- ptk_delstring("structureid", "ptk$viewwcaxes");
- pdel_struct(vrcaxes);
- ptk_delstring("structureid", "ptk$viewvrcaxes");
- pdel_struct(npccube);
- ptk_delstring("structureid", "ptk$viewnpccube");
- pdel_struct(projviewport);
- ptk_delstring("structureid", "ptk$viewprojviewport");
- pdel_struct(viewvolume);
- ptk_delstring("structureid", "ptk$viewviewvolume");
- pdel_struct(prpmarker);
- ptk_delstring("structureid", "ptk$viewprpmarker");
- pdel_struct(viewplane);
- ptk_delstring("structureid", "ptk$viewviewplane");
-
- pdel_struct(viewscene);
- ptk_delstring("structureid", "ptk$viewscene");
- pdel_struct(wcscene);
- ptk_delstring("structureid", "ptk$viewwcscene");
- pdel_struct(vrcscene);
- ptk_delstring("structureid", "ptk$viewvrcscene");
- pdel_struct(npcscene);
- ptk_delstring("structureid", "ptk$viewnpcscene");
- pdel_struct(dcscene);
- ptk_delstring("structureid", "ptk$viewdcscene");
-
- ptk_delstring("label", "view$mx_inv_vom");
- ptk_delstring("label", "view$mx_view_volume");
- ptk_delstring("label", "view$mx_prp");
- ptk_delstring("label", "view$mx_proj_viewport");
- ptk_delstring("label", "view$mx_vom");
- ptk_delstring("label", "view$mx_vmm");
- ptk_delstring("label", "view$mx_view_plane");
-
- /* return view representation */
- memcpy(rep->ori_matrix, vommat, sizeof(Pmatrix3));
- memcpy(rep->map_matrix, vmmmat, sizeof(Pmatrix3));
- rep->xy_clip = clipxy;
- rep->front_clip = clipfront;
- rep->back_clip = clipback;
- rep->clip_limit = viewmap.proj_vp;
-
- /* repost all menus, windows and other structs */
- for (i = 0; i < structs.num_postings; i++)
- ppost_struct(wsid, structs.postings[i].id, structs.postings[i].disp_pri);
- for (i = 0; i < pwindows.num_ints; i++)
- ptk_postwindow(pwindows.ints[i]);
- for (i = 0; i < pmenus.num_ints; i++)
- ptk_postmenu(wsid, pmenus.ints[i]);
- free(structs.postings);
- free(pmenus.ints);
- free(pwindows.ints);
-
- /* background colour */
- pset_colr_rep(wsid, 0, &backrep);
-
- ptk_redrawallstructs(wsid, PFLAG_ALWAYS);
-
- /* restore display update state */
- pset_disp_upd_st(wsid, defmode, modmode);
- } /* ptk_vieweditor */
-
- /*--------------------------------------------------------------------------*/
-
- /*function:external*/
- extern void ptk_setvieweditorattrs(C(Pint) menufont, C(Pint) windowfont,
- C(Pint) menucol, C(Pint) menutextcol,
- C(Pint) windowcol, C(Pint) bannercol, C(Pint) bannertextcol,
- C(Pint) tlcol, C(Pint) brcol, C(Pint) arrowcol, C(Pint) arrowedgecol)
- PreANSI(Pint menufont)
- PreANSI(Pint windowfont)
- PreANSI(Pint menucol)
- PreANSI(Pint menutextcol)
- PreANSI(Pint windowcol)
- PreANSI(Pint bannercol)
- PreANSI(Pint bannertextcol)
- PreANSI(Pint tlcol)
- PreANSI(Pint brcol)
- PreANSI(Pint arrowcol)
- PreANSI(Pint arrowedgecol)
- /*
- ** \parambegin
- ** \param{Pint}{menufont}{menu text font}{IN}
- ** \param{Pint}{windowfont}{window text font}{IN}
- ** \param{Pint}{menucol}{menu colour index}{IN}
- ** \param{Pint}{menutextcol}{menu text colour index}{IN}
- ** \param{Pint}{windowcol}{window interior colour index}{IN}
- ** \param{Pint}{bannercol}{window banner colour index}{IN}
- ** \param{Pint}{bannertextcol}{window banner text colour index}{IN}
- ** \param{Pint}{tlcol}{top-left colour index}{IN}
- ** \param{Pint}{brcol}{bottom-right colour index}{IN}
- ** \param{Pint}{arrowcol}{arrow colour index}{IN}
- ** \param{Pint}{arrowedgecol}{arrow edge colour index}{IN}
- ** \paramend
- ** \blurb{This function enables the application to
- ** set the text font and colour attribute values for the menus and windows
- ** used in the PHIGS view editor.}
- */
- {
- menutextfont = menufont;
- windowtextfont = windowfont;
- menucolourind = menucol;
- windowcolourind = windowcol;
- menutextcolourind = menutextcol;
- bannercolourind = bannercol;
- bannertextcolourind = bannertextcol;
- tlcolourind = tlcol;
- brcolourind = brcol;
- arrowcolourind = arrowcol;
- arrowedgecolourind = arrowedgecol;
- } /* ptk_setvieweditorattrs */
-
- /*--------------------------------------------------------------------------*/
-
- /*function:external*/
- extern void ptk_inqvieweditorattrs(C(Pint *) menufont, C(Pint *) windowfont,
- C(Pint *) menucol, C(Pint *) menutextcol, C(Pint *) windowcol,
- C(Pint *) bannercol, C(Pint *) bannertextcol, C(Pint *) tlcol,
- C(Pint *) brcol, C(Pint *) arrowcol, C(Pint *) arrowedgecol)
- PreANSI(Pint *menufont)
- PreANSI(Pint *windowfont)
- PreANSI(Pint *menucol)
- PreANSI(Pint *menutextcol)
- PreANSI(Pint *windowcol)
- PreANSI(Pint *bannercol)
- PreANSI(Pint *bannertextcol)
- PreANSI(Pint *tlcol)
- PreANSI(Pint *brcol)
- PreANSI(Pint *arrowcol)
- PreANSI(Pint *arrowedgecol)
- /*
- ** \parambegin
- ** \param{Pint *}{menufont}{menu text font}{IN}
- ** \param{Pint *}{windowfont}{window text font}{IN}
- ** \param{Pint *}{menucol}{menu colour index}{IN}
- ** \param{Pint *}{menutextcol}{menu text colour index}{IN}
- ** \param{Pint *}{windowcol}{window interior colour index}{IN}
- ** \param{Pint *}{bannercol}{window banner colour index}{IN}
- ** \param{Pint *}{bannertextcol}{window banner text colour index}{IN}
- ** \param{Pint *}{tlcol}{top-left colour index}{IN}
- ** \param{Pint *}{brcol}{bottom-right colour index}{IN}
- ** \param{Pint *}{arrowcol}{arrow colour index}{IN}
- ** \param{Pint *}{arrowedgecol}{arrow edge colour index}{IN}
- ** \paramend
- ** \blurb{This function may be used to obtain the text font and
- ** colour attribute values of menus and windows used in the PHIGS view
- ** editor.}
- */
- {
- *menufont = menutextfont;
- *windowfont = windowtextfont;
- *menucol = menucolourind;
- *windowcol = windowcolourind;
- *menutextcol = menutextcolourind;
- *bannercol = bannercolourind;
- *bannertextcol = bannertextcolourind;
- *tlcol = tlcolourind;
- *brcol = brcolourind;
- *arrowcol = arrowcolourind;
- *arrowedgecol = arrowedgecolourind;
- } /* ptk_inqvieweditorattrs */
-
- /*--------------------------------------------------------------------------*/
-
- /* end of view.c */
-